You've already forked mysqld_exporter
mirror of
https://github.com/prometheus/mysqld_exporter.git
synced 2025-07-31 17:44:21 +03:00
Update vendoring (#403)
* Switch out gopkg.in for github.com in go-sqlmock. Signed-off-by: Ben Kochie <superq@gmail.com>
This commit is contained in:
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeBinlogSize(t *testing.T) {
|
func TestScrapeBinlogSize(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeEngineInnodbStatus(t *testing.T) {
|
func TestScrapeEngineInnodbStatus(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSanitizeTokudbMetric(t *testing.T) {
|
func TestSanitizeTokudbMetric(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeGlobalStatus(t *testing.T) {
|
func TestScrapeGlobalStatus(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeGlobalVariables(t *testing.T) {
|
func TestScrapeGlobalVariables(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeClientStat(t *testing.T) {
|
func TestScrapeClientStat(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeInnodbCmp(t *testing.T) {
|
func TestScrapeInnodbCmp(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeInnodbCmpMem(t *testing.T) {
|
func TestScrapeInnodbCmpMem(t *testing.T) {
|
||||||
|
@ -17,11 +17,11 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/prometheus/common/log"
|
"github.com/prometheus/common/log"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeInfoSchemaInnodbTablespaces(t *testing.T) {
|
func TestScrapeInfoSchemaInnodbTablespaces(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeQueryResponseTime(t *testing.T) {
|
func TestScrapeQueryResponseTime(t *testing.T) {
|
||||||
|
@ -17,9 +17,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeSchemaStat(t *testing.T) {
|
func TestScrapeSchemaStat(t *testing.T) {
|
||||||
|
@ -17,9 +17,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeTableStat(t *testing.T) {
|
func TestScrapeTableStat(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeUserStat(t *testing.T) {
|
func TestScrapeUserStat(t *testing.T) {
|
||||||
|
@ -18,10 +18,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapePerfIndexIOWaits(t *testing.T) {
|
func TestScrapePerfIndexIOWaits(t *testing.T) {
|
||||||
|
@ -18,10 +18,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapePerfReplicationApplierStatsByWorker(t *testing.T) {
|
func TestScrapePerfReplicationApplierStatsByWorker(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeSlaveHostsOldFormat(t *testing.T) {
|
func TestScrapeSlaveHostsOldFormat(t *testing.T) {
|
||||||
|
@ -17,10 +17,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/smartystreets/goconvey/convey"
|
"github.com/smartystreets/goconvey/convey"
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScrapeSlaveStatus(t *testing.T) {
|
func TestScrapeSlaveStatus(t *testing.T) {
|
||||||
|
20
go.mod
20
go.mod
@ -1,21 +1,23 @@
|
|||||||
module github.com/prometheus/mysqld_exporter
|
module github.com/prometheus/mysqld_exporter
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/DATA-DOG/go-sqlmock v1.3.3
|
||||||
github.com/go-sql-driver/mysql v1.4.1
|
github.com/go-sql-driver/mysql v1.4.1
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20170609002610-dc374d327045 // indirect
|
github.com/golang/protobuf v1.3.2 // indirect
|
||||||
github.com/jtolds/gls v4.20.0+incompatible // indirect
|
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||||
github.com/kr/pretty v0.1.0 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.0.0
|
github.com/prometheus/client_golang v1.0.0
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
|
||||||
github.com/prometheus/common v0.4.1
|
github.com/prometheus/common v0.6.0
|
||||||
|
github.com/prometheus/procfs v0.0.3 // indirect
|
||||||
github.com/satori/go.uuid v1.2.0
|
github.com/satori/go.uuid v1.2.0
|
||||||
github.com/sirupsen/logrus v1.4.2 // indirect
|
github.com/sirupsen/logrus v1.4.2 // indirect
|
||||||
github.com/smartystreets/assertions v0.0.0-20180301161246-7678a5452ebe // indirect
|
github.com/smartystreets/assertions v1.0.0 // indirect
|
||||||
github.com/smartystreets/goconvey v0.0.0-20170602164621-9e8dc3f972df
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a
|
||||||
github.com/smartystreets/gunit v0.0.0-20180314194857-6f0d6275bdcd // indirect
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect
|
||||||
google.golang.org/appengine v1.1.0 // indirect
|
google.golang.org/appengine v1.6.1 // indirect
|
||||||
gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0
|
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||||
gopkg.in/ini.v1 v1.37.0
|
gopkg.in/ini.v1 v1.44.0
|
||||||
)
|
)
|
||||||
|
55
go.sum
55
go.sum
@ -1,3 +1,5 @@
|
|||||||
|
github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=
|
||||||
|
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
|
||||||
@ -10,6 +12,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
|||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
@ -19,14 +22,20 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM
|
|||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20170609002610-dc374d327045 h1:zLWUj0hey2CaQncUELzrqcjDJkQ5LTFynzcd982pMIs=
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20170609002610-dc374d327045/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
@ -51,21 +60,24 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx
|
|||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
|
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
|
||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
|
||||||
|
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
|
||||||
|
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180301161246-7678a5452ebe h1:N9Tx6rKITAMSw2lgWIyLOgoTikD33tNWmiT7GPkz0es=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180301161246-7678a5452ebe/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20170602164621-9e8dc3f972df h1:AawEzDdiSpy07QO9efSOHQ/BRincGLxilju4pOq3k8s=
|
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20170602164621-9e8dc3f972df/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||||
github.com/smartystreets/gunit v0.0.0-20180314194857-6f0d6275bdcd h1:p5kvxG4NHogJX1brTLtvUSGdW0/aBvIyqDSW7tmnsmQ=
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/smartystreets/gunit v0.0.0-20180314194857-6f0d6275bdcd/go.mod h1:XUKj4gbqj2QvJk/OdLWzyZ3FYli0f+MdpngyryX0gcw=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
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 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
@ -74,25 +86,40 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
|
|||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/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=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 h1:mzjBh+S5frKOsOBobWIMAbXavqjmgO17k/2puhcFR94=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 h1:mzjBh+S5frKOsOBobWIMAbXavqjmgO17k/2puhcFR94=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
|
||||||
gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0 h1:FVCohIoYO7IJoDDVpV2pdq7SgrMH6wHnuTyrdrxJNoY=
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0/go.mod h1:OdE7CF6DbADk7lN8LIKRzRJTTZXIjtWgA5THM5lhBAw=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/ini.v1 v1.37.0 h1:Jg0A8mA6eCo6oGRA5ZgEwO9u/DIdlWMxyMzad9tN/rI=
|
gopkg.in/ini.v1 v1.44.0 h1:YRJzTUp0kSYWUVFF5XAbDFfyiqwsl0Vb9R8TVP5eRi0=
|
||||||
gopkg.in/ini.v1 v1.37.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
|
go_import_path: github.com/DATA-DOG/go-sqlmock
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.2.x
|
- 1.2.x
|
||||||
- 1.3.x
|
- 1.3.x
|
||||||
@ -8,7 +10,11 @@ go:
|
|||||||
- 1.6.x
|
- 1.6.x
|
||||||
- 1.7.x
|
- 1.7.x
|
||||||
- 1.8.x
|
- 1.8.x
|
||||||
# - tip # sadly fails most of the times
|
- 1.9.x
|
||||||
|
- 1.10.x
|
||||||
|
- 1.11.x
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- go vet
|
- go vet
|
@ -1,6 +1,6 @@
|
|||||||
The three clause BSD license (http://en.wikipedia.org/wiki/BSD_licenses)
|
The three clause BSD license (http://en.wikipedia.org/wiki/BSD_licenses)
|
||||||
|
|
||||||
Copyright (c) 2013-2017, DATA-DOG team
|
Copyright (c) 2013-2019, DATA-DOG team
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
@ -1,5 +1,6 @@
|
|||||||
[](https://travis-ci.org/DATA-DOG/go-sqlmock)
|
[](https://travis-ci.org/DATA-DOG/go-sqlmock)
|
||||||
[](https://godoc.org/github.com/DATA-DOG/go-sqlmock)
|
[](https://godoc.org/github.com/DATA-DOG/go-sqlmock)
|
||||||
|
[](https://goreportcard.com/report/github.com/DATA-DOG/go-sqlmock)
|
||||||
[](https://codecov.io/github/DATA-DOG/go-sqlmock)
|
[](https://codecov.io/github/DATA-DOG/go-sqlmock)
|
||||||
|
|
||||||
# Sql driver mock for Golang
|
# Sql driver mock for Golang
|
||||||
@ -22,7 +23,7 @@ interface, which was not required or useful for mocking and was removed. Hope it
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
go get gopkg.in/DATA-DOG/go-sqlmock.v1
|
go get github.com/DATA-DOG/go-sqlmock
|
||||||
|
|
||||||
## Documentation and Examples
|
## Documentation and Examples
|
||||||
|
|
||||||
@ -36,12 +37,16 @@ See implementation examples:
|
|||||||
- [blog API server](https://github.com/DATA-DOG/go-sqlmock/tree/master/examples/blog)
|
- [blog API server](https://github.com/DATA-DOG/go-sqlmock/tree/master/examples/blog)
|
||||||
- [the same orders example](https://github.com/DATA-DOG/go-sqlmock/tree/master/examples/orders)
|
- [the same orders example](https://github.com/DATA-DOG/go-sqlmock/tree/master/examples/orders)
|
||||||
|
|
||||||
### Something you may want to test
|
### Something you may want to test, assuming you use the [go-mysql-driver](https://github.com/go-sql-driver/mysql)
|
||||||
|
|
||||||
``` go
|
``` go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "database/sql"
|
import (
|
||||||
|
"database/sql"
|
||||||
|
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
|
|
||||||
func recordStats(db *sql.DB, userID, productID int64) (err error) {
|
func recordStats(db *sql.DB, userID, productID int64) (err error) {
|
||||||
tx, err := db.Begin()
|
tx, err := db.Begin()
|
||||||
@ -90,7 +95,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gopkg.in/DATA-DOG/go-sqlmock.v1"
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// a successful case
|
// a successful case
|
||||||
@ -113,7 +118,7 @@ func TestShouldUpdateStats(t *testing.T) {
|
|||||||
|
|
||||||
// we make sure that all expectations were met
|
// we make sure that all expectations were met
|
||||||
if err := mock.ExpectationsWereMet(); err != nil {
|
if err := mock.ExpectationsWereMet(); err != nil {
|
||||||
t.Errorf("there were unfulfilled expections: %s", err)
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,11 +144,33 @@ func TestShouldRollbackStatUpdatesOnFailure(t *testing.T) {
|
|||||||
|
|
||||||
// we make sure that all expectations were met
|
// we make sure that all expectations were met
|
||||||
if err := mock.ExpectationsWereMet(); err != nil {
|
if err := mock.ExpectationsWereMet(); err != nil {
|
||||||
t.Errorf("there were unfulfilled expections: %s", err)
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Customize SQL query matching
|
||||||
|
|
||||||
|
There were plenty of requests from users regarding SQL query string validation or different matching option.
|
||||||
|
We have now implemented the `QueryMatcher` interface, which can be passed through an option when calling
|
||||||
|
`sqlmock.New` or `sqlmock.NewWithDSN`.
|
||||||
|
|
||||||
|
This now allows to include some library, which would allow for example to parse and validate `mysql` SQL AST.
|
||||||
|
And create a custom QueryMatcher in order to validate SQL in sophisticated ways.
|
||||||
|
|
||||||
|
By default, **sqlmock** is preserving backward compatibility and default query matcher is `sqlmock.QueryMatcherRegexp`
|
||||||
|
which uses expected SQL string as a regular expression to match incoming query string. There is an equality matcher:
|
||||||
|
`QueryMatcherEqual` which will do a full case sensitive match.
|
||||||
|
|
||||||
|
In order to customize the QueryMatcher, use the following:
|
||||||
|
|
||||||
|
``` go
|
||||||
|
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
|
||||||
|
```
|
||||||
|
|
||||||
|
The query matcher can be fully customized based on user needs. **sqlmock** will not
|
||||||
|
provide a standard sql parsing matchers, since various drivers may not follow the same SQL standard.
|
||||||
|
|
||||||
## Matching arguments like time.Time
|
## Matching arguments like time.Time
|
||||||
|
|
||||||
There may be arguments which are of `struct` type and cannot be compared easily by value like `time.Time`. In this case
|
There may be arguments which are of `struct` type and cannot be compared easily by value like `time.Time`. In this case
|
||||||
@ -177,7 +204,7 @@ func TestAnyTimeArgument(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := mock.ExpectationsWereMet(); err != nil {
|
if err := mock.ExpectationsWereMet(); err != nil {
|
||||||
t.Errorf("there were unfulfilled expections: %s", err)
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -190,6 +217,9 @@ It only asserts that argument is of `time.Time` type.
|
|||||||
|
|
||||||
## Change Log
|
## Change Log
|
||||||
|
|
||||||
|
- **2019-02-13** - added `go.mod` removed the references and suggestions using `gopkg.in`.
|
||||||
|
- **2018-12-11** - added expectation of Rows to be closed, while mocking expected query.
|
||||||
|
- **2018-12-11** - introduced an option to provide **QueryMatcher** in order to customize SQL query matching.
|
||||||
- **2017-09-01** - it is now possible to expect that prepared statement will be closed,
|
- **2017-09-01** - it is now possible to expect that prepared statement will be closed,
|
||||||
using **ExpectedPrepare.WillBeClosed**.
|
using **ExpectedPrepare.WillBeClosed**.
|
||||||
- **2017-02-09** - implemented support for **go1.8** features. **Rows** interface was changed to struct
|
- **2017-02-09** - implemented support for **go1.8** features. **Rows** interface was changed to struct
|
@ -35,11 +35,12 @@ func (d *mockDriver) Open(dsn string) (driver.Conn, error) {
|
|||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates sqlmock database connection
|
// New creates sqlmock database connection and a mock to manage expectations.
|
||||||
// and a mock to manage expectations.
|
// Accepts options, like ValueConverterOption, to use a ValueConverter from
|
||||||
|
// a specific driver.
|
||||||
// Pings db so that all expectations could be
|
// Pings db so that all expectations could be
|
||||||
// asserted.
|
// asserted.
|
||||||
func New() (*sql.DB, Sqlmock, error) {
|
func New(options ...func(*sqlmock) error) (*sql.DB, Sqlmock, error) {
|
||||||
pool.Lock()
|
pool.Lock()
|
||||||
dsn := fmt.Sprintf("sqlmock_db_%d", pool.counter)
|
dsn := fmt.Sprintf("sqlmock_db_%d", pool.counter)
|
||||||
pool.counter++
|
pool.counter++
|
||||||
@ -48,11 +49,13 @@ func New() (*sql.DB, Sqlmock, error) {
|
|||||||
pool.conns[dsn] = smock
|
pool.conns[dsn] = smock
|
||||||
pool.Unlock()
|
pool.Unlock()
|
||||||
|
|
||||||
return smock.open()
|
return smock.open(options)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWithDSN creates sqlmock database connection
|
// NewWithDSN creates sqlmock database connection with a specific DSN
|
||||||
// with a specific DSN and a mock to manage expectations.
|
// and a mock to manage expectations.
|
||||||
|
// Accepts options, like ValueConverterOption, to use a ValueConverter from
|
||||||
|
// a specific driver.
|
||||||
// Pings db so that all expectations could be asserted.
|
// Pings db so that all expectations could be asserted.
|
||||||
//
|
//
|
||||||
// This method is introduced because of sql abstraction
|
// This method is introduced because of sql abstraction
|
||||||
@ -64,7 +67,7 @@ func New() (*sql.DB, Sqlmock, error) {
|
|||||||
//
|
//
|
||||||
// It is not recommended to use this method, unless you
|
// It is not recommended to use this method, unless you
|
||||||
// really need it and there is no other way around.
|
// really need it and there is no other way around.
|
||||||
func NewWithDSN(dsn string) (*sql.DB, Sqlmock, error) {
|
func NewWithDSN(dsn string, options ...func(*sqlmock) error) (*sql.DB, Sqlmock, error) {
|
||||||
pool.Lock()
|
pool.Lock()
|
||||||
if _, ok := pool.conns[dsn]; ok {
|
if _, ok := pool.conns[dsn]; ok {
|
||||||
pool.Unlock()
|
pool.Unlock()
|
||||||
@ -74,5 +77,5 @@ func NewWithDSN(dsn string) (*sql.DB, Sqlmock, error) {
|
|||||||
pool.conns[dsn] = smock
|
pool.conns[dsn] = smock
|
||||||
pool.Unlock()
|
pool.Unlock()
|
||||||
|
|
||||||
return smock.open()
|
return smock.open(options)
|
||||||
}
|
}
|
@ -3,7 +3,6 @@ package sqlmock
|
|||||||
import (
|
import (
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@ -126,8 +125,10 @@ func (e *ExpectedRollback) String() string {
|
|||||||
// Returned by *Sqlmock.ExpectQuery.
|
// Returned by *Sqlmock.ExpectQuery.
|
||||||
type ExpectedQuery struct {
|
type ExpectedQuery struct {
|
||||||
queryBasedExpectation
|
queryBasedExpectation
|
||||||
rows driver.Rows
|
rows driver.Rows
|
||||||
delay time.Duration
|
delay time.Duration
|
||||||
|
rowsMustBeClosed bool
|
||||||
|
rowsWereClosed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithArgs will match given expected args to actual database query arguments.
|
// WithArgs will match given expected args to actual database query arguments.
|
||||||
@ -138,6 +139,12 @@ func (e *ExpectedQuery) WithArgs(args ...driver.Value) *ExpectedQuery {
|
|||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RowsWillBeClosed expects this query rows to be closed.
|
||||||
|
func (e *ExpectedQuery) RowsWillBeClosed() *ExpectedQuery {
|
||||||
|
e.rowsMustBeClosed = true
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
// WillReturnError allows to set an error for expected database query
|
// WillReturnError allows to set an error for expected database query
|
||||||
func (e *ExpectedQuery) WillReturnError(err error) *ExpectedQuery {
|
func (e *ExpectedQuery) WillReturnError(err error) *ExpectedQuery {
|
||||||
e.err = err
|
e.err = err
|
||||||
@ -154,7 +161,7 @@ func (e *ExpectedQuery) WillDelayFor(duration time.Duration) *ExpectedQuery {
|
|||||||
// String returns string representation
|
// String returns string representation
|
||||||
func (e *ExpectedQuery) String() string {
|
func (e *ExpectedQuery) String() string {
|
||||||
msg := "ExpectedQuery => expecting Query, QueryContext or QueryRow which:"
|
msg := "ExpectedQuery => expecting Query, QueryContext or QueryRow which:"
|
||||||
msg += "\n - matches sql: '" + e.sqlRegex.String() + "'"
|
msg += "\n - matches sql: '" + e.expectSQL + "'"
|
||||||
|
|
||||||
if len(e.args) == 0 {
|
if len(e.args) == 0 {
|
||||||
msg += "\n - is without arguments"
|
msg += "\n - is without arguments"
|
||||||
@ -209,7 +216,7 @@ func (e *ExpectedExec) WillDelayFor(duration time.Duration) *ExpectedExec {
|
|||||||
// String returns string representation
|
// String returns string representation
|
||||||
func (e *ExpectedExec) String() string {
|
func (e *ExpectedExec) String() string {
|
||||||
msg := "ExpectedExec => expecting Exec or ExecContext which:"
|
msg := "ExpectedExec => expecting Exec or ExecContext which:"
|
||||||
msg += "\n - matches sql: '" + e.sqlRegex.String() + "'"
|
msg += "\n - matches sql: '" + e.expectSQL + "'"
|
||||||
|
|
||||||
if len(e.args) == 0 {
|
if len(e.args) == 0 {
|
||||||
msg += "\n - is without arguments"
|
msg += "\n - is without arguments"
|
||||||
@ -253,7 +260,7 @@ func (e *ExpectedExec) WillReturnResult(result driver.Result) *ExpectedExec {
|
|||||||
type ExpectedPrepare struct {
|
type ExpectedPrepare struct {
|
||||||
commonExpectation
|
commonExpectation
|
||||||
mock *sqlmock
|
mock *sqlmock
|
||||||
sqlRegex *regexp.Regexp
|
expectSQL string
|
||||||
statement driver.Stmt
|
statement driver.Stmt
|
||||||
closeErr error
|
closeErr error
|
||||||
mustBeClosed bool
|
mustBeClosed bool
|
||||||
@ -288,19 +295,21 @@ func (e *ExpectedPrepare) WillBeClosed() *ExpectedPrepare {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ExpectQuery allows to expect Query() or QueryRow() on this prepared statement.
|
// ExpectQuery allows to expect Query() or QueryRow() on this prepared statement.
|
||||||
// this method is convenient in order to prevent duplicating sql query string matching.
|
// This method is convenient in order to prevent duplicating sql query string matching.
|
||||||
func (e *ExpectedPrepare) ExpectQuery() *ExpectedQuery {
|
func (e *ExpectedPrepare) ExpectQuery() *ExpectedQuery {
|
||||||
eq := &ExpectedQuery{}
|
eq := &ExpectedQuery{}
|
||||||
eq.sqlRegex = e.sqlRegex
|
eq.expectSQL = e.expectSQL
|
||||||
|
eq.converter = e.mock.converter
|
||||||
e.mock.expected = append(e.mock.expected, eq)
|
e.mock.expected = append(e.mock.expected, eq)
|
||||||
return eq
|
return eq
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExpectExec allows to expect Exec() on this prepared statement.
|
// ExpectExec allows to expect Exec() on this prepared statement.
|
||||||
// this method is convenient in order to prevent duplicating sql query string matching.
|
// This method is convenient in order to prevent duplicating sql query string matching.
|
||||||
func (e *ExpectedPrepare) ExpectExec() *ExpectedExec {
|
func (e *ExpectedPrepare) ExpectExec() *ExpectedExec {
|
||||||
eq := &ExpectedExec{}
|
eq := &ExpectedExec{}
|
||||||
eq.sqlRegex = e.sqlRegex
|
eq.expectSQL = e.expectSQL
|
||||||
|
eq.converter = e.mock.converter
|
||||||
e.mock.expected = append(e.mock.expected, eq)
|
e.mock.expected = append(e.mock.expected, eq)
|
||||||
return eq
|
return eq
|
||||||
}
|
}
|
||||||
@ -308,7 +317,7 @@ func (e *ExpectedPrepare) ExpectExec() *ExpectedExec {
|
|||||||
// String returns string representation
|
// String returns string representation
|
||||||
func (e *ExpectedPrepare) String() string {
|
func (e *ExpectedPrepare) String() string {
|
||||||
msg := "ExpectedPrepare => expecting Prepare statement which:"
|
msg := "ExpectedPrepare => expecting Prepare statement which:"
|
||||||
msg += "\n - matches sql: '" + e.sqlRegex.String() + "'"
|
msg += "\n - matches sql: '" + e.expectSQL + "'"
|
||||||
|
|
||||||
if e.err != nil {
|
if e.err != nil {
|
||||||
msg += fmt.Sprintf("\n - should return error: %s", e.err)
|
msg += fmt.Sprintf("\n - should return error: %s", e.err)
|
||||||
@ -325,15 +334,12 @@ func (e *ExpectedPrepare) String() string {
|
|||||||
// adds a query matching logic
|
// adds a query matching logic
|
||||||
type queryBasedExpectation struct {
|
type queryBasedExpectation struct {
|
||||||
commonExpectation
|
commonExpectation
|
||||||
sqlRegex *regexp.Regexp
|
expectSQL string
|
||||||
args []driver.Value
|
converter driver.ValueConverter
|
||||||
|
args []driver.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *queryBasedExpectation) attemptMatch(sql string, args []namedValue) (err error) {
|
func (e *queryBasedExpectation) attemptArgMatch(args []namedValue) (err error) {
|
||||||
if !e.queryMatches(sql) {
|
|
||||||
return fmt.Errorf(`could not match sql: "%s" with expected regexp "%s"`, sql, e.sqlRegex.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// catch panic
|
// catch panic
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
@ -347,7 +353,3 @@ func (e *queryBasedExpectation) attemptMatch(sql string, args []namedValue) (err
|
|||||||
err = e.argsMatches(args)
|
err = e.argsMatches(args)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *queryBasedExpectation) queryMatches(sql string) bool {
|
|
||||||
return e.sqlRegex.MatchString(sql)
|
|
||||||
}
|
|
@ -11,7 +11,7 @@ import (
|
|||||||
// WillReturnRows specifies the set of resulting rows that will be returned
|
// WillReturnRows specifies the set of resulting rows that will be returned
|
||||||
// by the triggered query
|
// by the triggered query
|
||||||
func (e *ExpectedQuery) WillReturnRows(rows *Rows) *ExpectedQuery {
|
func (e *ExpectedQuery) WillReturnRows(rows *Rows) *ExpectedQuery {
|
||||||
e.rows = &rowSets{sets: []*Rows{rows}}
|
e.rows = &rowSets{sets: []*Rows{rows}, ex: e}
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ func (e *queryBasedExpectation) argsMatches(args []namedValue) error {
|
|||||||
|
|
||||||
dval := e.args[k]
|
dval := e.args[k]
|
||||||
// convert to driver converter
|
// convert to driver converter
|
||||||
darg, err := driver.DefaultParameterConverter.ConvertValue(dval)
|
darg, err := e.converter.ConvertValue(dval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
|
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ func (e *ExpectedQuery) WillReturnRows(rows ...*Rows) *ExpectedQuery {
|
|||||||
for i, r := range rows {
|
for i, r := range rows {
|
||||||
sets[i] = r
|
sets[i] = r
|
||||||
}
|
}
|
||||||
e.rows = &rowSets{sets: sets}
|
e.rows = &rowSets{sets: sets, ex: e}
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ func (e *queryBasedExpectation) argsMatches(args []namedValue) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// convert to driver converter
|
// convert to driver converter
|
||||||
darg, err := driver.DefaultParameterConverter.ConvertValue(dval)
|
darg, err := e.converter.ConvertValue(dval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
|
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
|
||||||
}
|
}
|
1
vendor/github.com/DATA-DOG/go-sqlmock/go.mod
generated
vendored
Normal file
1
vendor/github.com/DATA-DOG/go-sqlmock/go.mod
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
module github.com/DATA-DOG/go-sqlmock
|
22
vendor/github.com/DATA-DOG/go-sqlmock/options.go
generated
vendored
Normal file
22
vendor/github.com/DATA-DOG/go-sqlmock/options.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package sqlmock
|
||||||
|
|
||||||
|
import "database/sql/driver"
|
||||||
|
|
||||||
|
// ValueConverterOption allows to create a sqlmock connection
|
||||||
|
// with a custom ValueConverter to support drivers with special data types.
|
||||||
|
func ValueConverterOption(converter driver.ValueConverter) func(*sqlmock) error {
|
||||||
|
return func(s *sqlmock) error {
|
||||||
|
s.converter = converter
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryMatcherOption allows to customize SQL query matcher
|
||||||
|
// and match SQL query strings in more sophisticated ways.
|
||||||
|
// The default QueryMatcher is QueryMatcherRegexp.
|
||||||
|
func QueryMatcherOption(queryMatcher QueryMatcher) func(*sqlmock) error {
|
||||||
|
return func(s *sqlmock) error {
|
||||||
|
s.queryMatcher = queryMatcher
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
68
vendor/github.com/DATA-DOG/go-sqlmock/query.go
generated
vendored
Normal file
68
vendor/github.com/DATA-DOG/go-sqlmock/query.go
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package sqlmock
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var re = regexp.MustCompile("\\s+")
|
||||||
|
|
||||||
|
// strip out new lines and trim spaces
|
||||||
|
func stripQuery(q string) (s string) {
|
||||||
|
return strings.TrimSpace(re.ReplaceAllString(q, " "))
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryMatcher is an SQL query string matcher interface,
|
||||||
|
// which can be used to customize validation of SQL query strings.
|
||||||
|
// As an example, external library could be used to build
|
||||||
|
// and validate SQL ast, columns selected.
|
||||||
|
//
|
||||||
|
// sqlmock can be customized to implement a different QueryMatcher
|
||||||
|
// configured through an option when sqlmock.New or sqlmock.NewWithDSN
|
||||||
|
// is called, default QueryMatcher is QueryMatcherRegexp.
|
||||||
|
type QueryMatcher interface {
|
||||||
|
|
||||||
|
// Match expected SQL query string without whitespace to
|
||||||
|
// actual SQL.
|
||||||
|
Match(expectedSQL, actualSQL string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryMatcherFunc type is an adapter to allow the use of
|
||||||
|
// ordinary functions as QueryMatcher. If f is a function
|
||||||
|
// with the appropriate signature, QueryMatcherFunc(f) is a
|
||||||
|
// QueryMatcher that calls f.
|
||||||
|
type QueryMatcherFunc func(expectedSQL, actualSQL string) error
|
||||||
|
|
||||||
|
// Match implements the QueryMatcher
|
||||||
|
func (f QueryMatcherFunc) Match(expectedSQL, actualSQL string) error {
|
||||||
|
return f(expectedSQL, actualSQL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryMatcherRegexp is the default SQL query matcher
|
||||||
|
// used by sqlmock. It parses expectedSQL to a regular
|
||||||
|
// expression and attempts to match actualSQL.
|
||||||
|
var QueryMatcherRegexp QueryMatcher = QueryMatcherFunc(func(expectedSQL, actualSQL string) error {
|
||||||
|
expect := stripQuery(expectedSQL)
|
||||||
|
actual := stripQuery(actualSQL)
|
||||||
|
re, err := regexp.Compile(expect)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !re.MatchString(actual) {
|
||||||
|
return fmt.Errorf(`could not match actual sql: "%s" with expected regexp "%s"`, actual, re.String())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
// QueryMatcherEqual is the SQL query matcher
|
||||||
|
// which simply tries a case sensitive match of
|
||||||
|
// expected and actual SQL strings without whitespace.
|
||||||
|
var QueryMatcherEqual QueryMatcher = QueryMatcherFunc(func(expectedSQL, actualSQL string) error {
|
||||||
|
expect := stripQuery(expectedSQL)
|
||||||
|
actual := stripQuery(actualSQL)
|
||||||
|
if actual != expect {
|
||||||
|
return fmt.Errorf(`actual sql: "%s" does not equal to expected "%s"`, actual, expect)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// CSVColumnParser is a function which converts trimmed csv
|
// CSVColumnParser is a function which converts trimmed csv
|
||||||
// column string to a []byte representation. currently
|
// column string to a []byte representation. Currently
|
||||||
// transforms NULL to nil
|
// transforms NULL to nil
|
||||||
var CSVColumnParser = func(s string) []byte {
|
var CSVColumnParser = func(s string) []byte {
|
||||||
switch {
|
switch {
|
||||||
@ -22,6 +22,7 @@ var CSVColumnParser = func(s string) []byte {
|
|||||||
type rowSets struct {
|
type rowSets struct {
|
||||||
sets []*Rows
|
sets []*Rows
|
||||||
pos int
|
pos int
|
||||||
|
ex *ExpectedQuery
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rs *rowSets) Columns() []string {
|
func (rs *rowSets) Columns() []string {
|
||||||
@ -29,6 +30,7 @@ func (rs *rowSets) Columns() []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (rs *rowSets) Close() error {
|
func (rs *rowSets) Close() error {
|
||||||
|
rs.ex.rowsWereClosed = true
|
||||||
return rs.sets[rs.pos].closeErr
|
return rs.sets[rs.pos].closeErr
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,18 +83,24 @@ func (rs *rowSets) empty() bool {
|
|||||||
// Rows is a mocked collection of rows to
|
// Rows is a mocked collection of rows to
|
||||||
// return for Query result
|
// return for Query result
|
||||||
type Rows struct {
|
type Rows struct {
|
||||||
cols []string
|
converter driver.ValueConverter
|
||||||
rows [][]driver.Value
|
cols []string
|
||||||
pos int
|
rows [][]driver.Value
|
||||||
nextErr map[int]error
|
pos int
|
||||||
closeErr error
|
nextErr map[int]error
|
||||||
|
closeErr error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRows allows Rows to be created from a
|
// NewRows allows Rows to be created from a
|
||||||
// sql driver.Value slice or from the CSV string and
|
// sql driver.Value slice or from the CSV string and
|
||||||
// to be used as sql driver.Rows
|
// to be used as sql driver.Rows.
|
||||||
|
// Use Sqlmock.NewRows instead if using a custom converter
|
||||||
func NewRows(columns []string) *Rows {
|
func NewRows(columns []string) *Rows {
|
||||||
return &Rows{cols: columns, nextErr: make(map[int]error)}
|
return &Rows{
|
||||||
|
cols: columns,
|
||||||
|
nextErr: make(map[int]error),
|
||||||
|
converter: driver.DefaultParameterConverter,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CloseError allows to set an error
|
// CloseError allows to set an error
|
||||||
@ -126,6 +134,17 @@ func (r *Rows) AddRow(values ...driver.Value) *Rows {
|
|||||||
|
|
||||||
row := make([]driver.Value, len(r.cols))
|
row := make([]driver.Value, len(r.cols))
|
||||||
for i, v := range values {
|
for i, v := range values {
|
||||||
|
// Convert user-friendly values (such as int or driver.Valuer)
|
||||||
|
// to database/sql native value (driver.Value such as int64)
|
||||||
|
var err error
|
||||||
|
v, err = r.converter.ConvertValue(v)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf(
|
||||||
|
"row #%d, column #%d (%q) type %T: %s",
|
||||||
|
len(r.rows)+1, i, r.cols[i], values[i], err,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
row[i] = v
|
row[i] = v
|
||||||
}
|
}
|
||||||
|
|
@ -14,7 +14,6 @@ import (
|
|||||||
"database/sql"
|
"database/sql"
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -32,22 +31,19 @@ type Sqlmock interface {
|
|||||||
// were met in order. If any of them was not met - an error is returned.
|
// were met in order. If any of them was not met - an error is returned.
|
||||||
ExpectationsWereMet() error
|
ExpectationsWereMet() error
|
||||||
|
|
||||||
// ExpectPrepare expects Prepare() to be called with sql query
|
// ExpectPrepare expects Prepare() to be called with expectedSQL query.
|
||||||
// which match sqlRegexStr given regexp.
|
|
||||||
// the *ExpectedPrepare allows to mock database response.
|
// the *ExpectedPrepare allows to mock database response.
|
||||||
// Note that you may expect Query() or Exec() on the *ExpectedPrepare
|
// Note that you may expect Query() or Exec() on the *ExpectedPrepare
|
||||||
// statement to prevent repeating sqlRegexStr
|
// statement to prevent repeating expectedSQL
|
||||||
ExpectPrepare(sqlRegexStr string) *ExpectedPrepare
|
ExpectPrepare(expectedSQL string) *ExpectedPrepare
|
||||||
|
|
||||||
// ExpectQuery expects Query() or QueryRow() to be called with sql query
|
// ExpectQuery expects Query() or QueryRow() to be called with expectedSQL query.
|
||||||
// which match sqlRegexStr given regexp.
|
|
||||||
// the *ExpectedQuery allows to mock database response.
|
// the *ExpectedQuery allows to mock database response.
|
||||||
ExpectQuery(sqlRegexStr string) *ExpectedQuery
|
ExpectQuery(expectedSQL string) *ExpectedQuery
|
||||||
|
|
||||||
// ExpectExec expects Exec() to be called with sql query
|
// ExpectExec expects Exec() to be called with expectedSQL query.
|
||||||
// which match sqlRegexStr given regexp.
|
|
||||||
// the *ExpectedExec allows to mock database response
|
// the *ExpectedExec allows to mock database response
|
||||||
ExpectExec(sqlRegexStr string) *ExpectedExec
|
ExpectExec(expectedSQL string) *ExpectedExec
|
||||||
|
|
||||||
// ExpectBegin expects *sql.DB.Begin to be called.
|
// ExpectBegin expects *sql.DB.Begin to be called.
|
||||||
// the *ExpectedBegin allows to mock database response
|
// the *ExpectedBegin allows to mock database response
|
||||||
@ -73,22 +69,41 @@ type Sqlmock interface {
|
|||||||
// in any order. Or otherwise if switched to true, any unmatched
|
// in any order. Or otherwise if switched to true, any unmatched
|
||||||
// expectations will be expected in order
|
// expectations will be expected in order
|
||||||
MatchExpectationsInOrder(bool)
|
MatchExpectationsInOrder(bool)
|
||||||
|
|
||||||
|
// NewRows allows Rows to be created from a
|
||||||
|
// sql driver.Value slice or from the CSV string and
|
||||||
|
// to be used as sql driver.Rows.
|
||||||
|
NewRows(columns []string) *Rows
|
||||||
}
|
}
|
||||||
|
|
||||||
type sqlmock struct {
|
type sqlmock struct {
|
||||||
ordered bool
|
ordered bool
|
||||||
dsn string
|
dsn string
|
||||||
opened int
|
opened int
|
||||||
drv *mockDriver
|
drv *mockDriver
|
||||||
|
converter driver.ValueConverter
|
||||||
|
queryMatcher QueryMatcher
|
||||||
|
|
||||||
expected []expectation
|
expected []expectation
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) open() (*sql.DB, Sqlmock, error) {
|
func (c *sqlmock) open(options []func(*sqlmock) error) (*sql.DB, Sqlmock, error) {
|
||||||
db, err := sql.Open("sqlmock", c.dsn)
|
db, err := sql.Open("sqlmock", c.dsn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return db, c, err
|
return db, c, err
|
||||||
}
|
}
|
||||||
|
for _, option := range options {
|
||||||
|
err := option(c)
|
||||||
|
if err != nil {
|
||||||
|
return db, c, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if c.converter == nil {
|
||||||
|
c.converter = driver.DefaultParameterConverter
|
||||||
|
}
|
||||||
|
if c.queryMatcher == nil {
|
||||||
|
c.queryMatcher = QueryMatcherRegexp
|
||||||
|
}
|
||||||
return db, c, db.Ping()
|
return db, c, db.Ping()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +118,7 @@ func (c *sqlmock) MatchExpectationsInOrder(b bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Close a mock database driver connection. It may or may not
|
// Close a mock database driver connection. It may or may not
|
||||||
// be called depending on the sircumstances, but if it is called
|
// be called depending on the circumstances, but if it is called
|
||||||
// there must be an *ExpectedClose expectation satisfied.
|
// there must be an *ExpectedClose expectation satisfied.
|
||||||
// meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
// meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
||||||
func (c *sqlmock) Close() error {
|
func (c *sqlmock) Close() error {
|
||||||
@ -151,7 +166,11 @@ func (c *sqlmock) Close() error {
|
|||||||
|
|
||||||
func (c *sqlmock) ExpectationsWereMet() error {
|
func (c *sqlmock) ExpectationsWereMet() error {
|
||||||
for _, e := range c.expected {
|
for _, e := range c.expected {
|
||||||
if !e.fulfilled() {
|
e.Lock()
|
||||||
|
fulfilled := e.fulfilled()
|
||||||
|
e.Unlock()
|
||||||
|
|
||||||
|
if !fulfilled {
|
||||||
return fmt.Errorf("there is a remaining expectation which was not matched: %s", e)
|
return fmt.Errorf("there is a remaining expectation which was not matched: %s", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,6 +180,13 @@ func (c *sqlmock) ExpectationsWereMet() error {
|
|||||||
return fmt.Errorf("expected prepared statement to be closed, but it was not: %s", prep)
|
return fmt.Errorf("expected prepared statement to be closed, but it was not: %s", prep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// must check whether all expected queried rows are closed
|
||||||
|
if query, ok := e.(*ExpectedQuery); ok {
|
||||||
|
if query.rowsMustBeClosed && !query.rowsWereClosed {
|
||||||
|
return fmt.Errorf("expected query rows to be closed, but it was not: %s", query)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -168,11 +194,13 @@ func (c *sqlmock) ExpectationsWereMet() error {
|
|||||||
// Begin meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
// Begin meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
||||||
func (c *sqlmock) Begin() (driver.Tx, error) {
|
func (c *sqlmock) Begin() (driver.Tx, error) {
|
||||||
ex, err := c.begin()
|
ex, err := c.begin()
|
||||||
|
if ex != nil {
|
||||||
|
time.Sleep(ex.delay)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(ex.delay)
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,16 +256,17 @@ func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ex, err := c.exec(query, namedArgs)
|
ex, err := c.exec(query, namedArgs)
|
||||||
|
if ex != nil {
|
||||||
|
time.Sleep(ex.delay)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(ex.delay)
|
|
||||||
return ex.result, nil
|
return ex.result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
||||||
query = stripQuery(query)
|
|
||||||
var expected *ExpectedExec
|
var expected *ExpectedExec
|
||||||
var fulfilled int
|
var fulfilled int
|
||||||
var ok bool
|
var ok bool
|
||||||
@ -257,7 +286,12 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
|||||||
return nil, fmt.Errorf("call to ExecQuery '%s' with args %+v, was not expected, next expectation is: %s", query, args, next)
|
return nil, fmt.Errorf("call to ExecQuery '%s' with args %+v, was not expected, next expectation is: %s", query, args, next)
|
||||||
}
|
}
|
||||||
if exec, ok := next.(*ExpectedExec); ok {
|
if exec, ok := next.(*ExpectedExec); ok {
|
||||||
if err := exec.attemptMatch(query, args); err == nil {
|
if err := c.queryMatcher.Match(exec.expectSQL, query); err != nil {
|
||||||
|
next.Unlock()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := exec.attemptArgMatch(args); err == nil {
|
||||||
expected = exec
|
expected = exec
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -273,8 +307,8 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
|||||||
}
|
}
|
||||||
defer expected.Unlock()
|
defer expected.Unlock()
|
||||||
|
|
||||||
if !expected.queryMatches(query) {
|
if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil {
|
||||||
return nil, fmt.Errorf("ExecQuery '%s', does not match regex '%s'", query, expected.sqlRegex.String())
|
return nil, fmt.Errorf("ExecQuery: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := expected.argsMatches(args); err != nil {
|
if err := expected.argsMatches(args); err != nil {
|
||||||
@ -283,7 +317,7 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
|||||||
|
|
||||||
expected.triggered = true
|
expected.triggered = true
|
||||||
if expected.err != nil {
|
if expected.err != nil {
|
||||||
return nil, expected.err // mocked to return error
|
return expected, expected.err // mocked to return error
|
||||||
}
|
}
|
||||||
|
|
||||||
if expected.result == nil {
|
if expected.result == nil {
|
||||||
@ -293,10 +327,10 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) {
|
|||||||
return expected, nil
|
return expected, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) ExpectExec(sqlRegexStr string) *ExpectedExec {
|
func (c *sqlmock) ExpectExec(expectedSQL string) *ExpectedExec {
|
||||||
e := &ExpectedExec{}
|
e := &ExpectedExec{}
|
||||||
sqlRegexStr = stripQuery(sqlRegexStr)
|
e.expectSQL = expectedSQL
|
||||||
e.sqlRegex = regexp.MustCompile(sqlRegexStr)
|
e.converter = c.converter
|
||||||
c.expected = append(c.expected, e)
|
c.expected = append(c.expected, e)
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@ -304,11 +338,13 @@ func (c *sqlmock) ExpectExec(sqlRegexStr string) *ExpectedExec {
|
|||||||
// Prepare meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
// Prepare meets http://golang.org/pkg/database/sql/driver/#Conn interface
|
||||||
func (c *sqlmock) Prepare(query string) (driver.Stmt, error) {
|
func (c *sqlmock) Prepare(query string) (driver.Stmt, error) {
|
||||||
ex, err := c.prepare(query)
|
ex, err := c.prepare(query)
|
||||||
|
if ex != nil {
|
||||||
|
time.Sleep(ex.delay)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(ex.delay)
|
|
||||||
return &statement{c, ex, query}, nil
|
return &statement{c, ex, query}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,8 +353,6 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
|
|||||||
var fulfilled int
|
var fulfilled int
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|
||||||
query = stripQuery(query)
|
|
||||||
|
|
||||||
for _, next := range c.expected {
|
for _, next := range c.expected {
|
||||||
next.Lock()
|
next.Lock()
|
||||||
if next.fulfilled() {
|
if next.fulfilled() {
|
||||||
@ -337,7 +371,7 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if pr, ok := next.(*ExpectedPrepare); ok {
|
if pr, ok := next.(*ExpectedPrepare); ok {
|
||||||
if pr.sqlRegex.MatchString(query) {
|
if err := c.queryMatcher.Match(pr.expectSQL, query); err == nil {
|
||||||
expected = pr
|
expected = pr
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -353,17 +387,16 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
|
|||||||
return nil, fmt.Errorf(msg, query)
|
return nil, fmt.Errorf(msg, query)
|
||||||
}
|
}
|
||||||
defer expected.Unlock()
|
defer expected.Unlock()
|
||||||
if !expected.sqlRegex.MatchString(query) {
|
if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil {
|
||||||
return nil, fmt.Errorf("Prepare query string '%s', does not match regex [%s]", query, expected.sqlRegex.String())
|
return nil, fmt.Errorf("Prepare: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected.triggered = true
|
expected.triggered = true
|
||||||
return expected, expected.err
|
return expected, expected.err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) ExpectPrepare(sqlRegexStr string) *ExpectedPrepare {
|
func (c *sqlmock) ExpectPrepare(expectedSQL string) *ExpectedPrepare {
|
||||||
sqlRegexStr = stripQuery(sqlRegexStr)
|
e := &ExpectedPrepare{expectSQL: expectedSQL, mock: c}
|
||||||
e := &ExpectedPrepare{sqlRegex: regexp.MustCompile(sqlRegexStr), mock: c}
|
|
||||||
c.expected = append(c.expected, e)
|
c.expected = append(c.expected, e)
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@ -385,16 +418,17 @@ func (c *sqlmock) Query(query string, args []driver.Value) (driver.Rows, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ex, err := c.query(query, namedArgs)
|
ex, err := c.query(query, namedArgs)
|
||||||
|
if ex != nil {
|
||||||
|
time.Sleep(ex.delay)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(ex.delay)
|
|
||||||
return ex.rows, nil
|
return ex.rows, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) {
|
func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) {
|
||||||
query = stripQuery(query)
|
|
||||||
var expected *ExpectedQuery
|
var expected *ExpectedQuery
|
||||||
var fulfilled int
|
var fulfilled int
|
||||||
var ok bool
|
var ok bool
|
||||||
@ -414,7 +448,11 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error)
|
|||||||
return nil, fmt.Errorf("call to Query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next)
|
return nil, fmt.Errorf("call to Query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next)
|
||||||
}
|
}
|
||||||
if qr, ok := next.(*ExpectedQuery); ok {
|
if qr, ok := next.(*ExpectedQuery); ok {
|
||||||
if err := qr.attemptMatch(query, args); err == nil {
|
if err := c.queryMatcher.Match(qr.expectSQL, query); err != nil {
|
||||||
|
next.Unlock()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := qr.attemptArgMatch(args); err == nil {
|
||||||
expected = qr
|
expected = qr
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -432,8 +470,8 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error)
|
|||||||
|
|
||||||
defer expected.Unlock()
|
defer expected.Unlock()
|
||||||
|
|
||||||
if !expected.queryMatches(query) {
|
if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil {
|
||||||
return nil, fmt.Errorf("Query '%s', does not match regex [%s]", query, expected.sqlRegex.String())
|
return nil, fmt.Errorf("Query: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := expected.argsMatches(args); err != nil {
|
if err := expected.argsMatches(args); err != nil {
|
||||||
@ -442,7 +480,7 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error)
|
|||||||
|
|
||||||
expected.triggered = true
|
expected.triggered = true
|
||||||
if expected.err != nil {
|
if expected.err != nil {
|
||||||
return nil, expected.err // mocked to return error
|
return expected, expected.err // mocked to return error
|
||||||
}
|
}
|
||||||
|
|
||||||
if expected.rows == nil {
|
if expected.rows == nil {
|
||||||
@ -451,10 +489,10 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error)
|
|||||||
return expected, nil
|
return expected, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *sqlmock) ExpectQuery(sqlRegexStr string) *ExpectedQuery {
|
func (c *sqlmock) ExpectQuery(expectedSQL string) *ExpectedQuery {
|
||||||
e := &ExpectedQuery{}
|
e := &ExpectedQuery{}
|
||||||
sqlRegexStr = stripQuery(sqlRegexStr)
|
e.expectSQL = expectedSQL
|
||||||
e.sqlRegex = regexp.MustCompile(sqlRegexStr)
|
e.converter = c.converter
|
||||||
c.expected = append(c.expected, e)
|
c.expected = append(c.expected, e)
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@ -540,3 +578,12 @@ func (c *sqlmock) Rollback() error {
|
|||||||
expected.Unlock()
|
expected.Unlock()
|
||||||
return expected.err
|
return expected.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewRows allows Rows to be created from a
|
||||||
|
// sql driver.Value slice or from the CSV string and
|
||||||
|
// to be used as sql driver.Rows.
|
||||||
|
func (c *sqlmock) NewRows(columns []string) *Rows {
|
||||||
|
r := NewRows(columns)
|
||||||
|
r.converter = c.converter
|
||||||
|
return r
|
||||||
|
}
|
@ -9,6 +9,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrCancelled defines an error value, which can be expected in case of
|
||||||
|
// such cancellation error.
|
||||||
var ErrCancelled = errors.New("canceling query due to user request")
|
var ErrCancelled = errors.New("canceling query due to user request")
|
||||||
|
|
||||||
// Implement the "QueryerContext" interface
|
// Implement the "QueryerContext" interface
|
||||||
@ -19,16 +21,19 @@ func (c *sqlmock) QueryContext(ctx context.Context, query string, args []driver.
|
|||||||
}
|
}
|
||||||
|
|
||||||
ex, err := c.query(query, namedArgs)
|
ex, err := c.query(query, namedArgs)
|
||||||
if err != nil {
|
if ex != nil {
|
||||||
return nil, err
|
select {
|
||||||
|
case <-time.After(ex.delay):
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ex.rows, nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, ErrCancelled
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
return nil, err
|
||||||
case <-time.After(ex.delay):
|
|
||||||
return ex.rows, nil
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil, ErrCancelled
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement the "ExecerContext" interface
|
// Implement the "ExecerContext" interface
|
||||||
@ -39,46 +44,55 @@ func (c *sqlmock) ExecContext(ctx context.Context, query string, args []driver.N
|
|||||||
}
|
}
|
||||||
|
|
||||||
ex, err := c.exec(query, namedArgs)
|
ex, err := c.exec(query, namedArgs)
|
||||||
if err != nil {
|
if ex != nil {
|
||||||
return nil, err
|
select {
|
||||||
|
case <-time.After(ex.delay):
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ex.result, nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, ErrCancelled
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
return nil, err
|
||||||
case <-time.After(ex.delay):
|
|
||||||
return ex.result, nil
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil, ErrCancelled
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement the "ConnBeginTx" interface
|
// Implement the "ConnBeginTx" interface
|
||||||
func (c *sqlmock) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
|
func (c *sqlmock) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
|
||||||
ex, err := c.begin()
|
ex, err := c.begin()
|
||||||
if err != nil {
|
if ex != nil {
|
||||||
return nil, err
|
select {
|
||||||
|
case <-time.After(ex.delay):
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return c, nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, ErrCancelled
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
return nil, err
|
||||||
case <-time.After(ex.delay):
|
|
||||||
return c, nil
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil, ErrCancelled
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement the "ConnPrepareContext" interface
|
// Implement the "ConnPrepareContext" interface
|
||||||
func (c *sqlmock) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
|
func (c *sqlmock) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
|
||||||
ex, err := c.prepare(query)
|
ex, err := c.prepare(query)
|
||||||
if err != nil {
|
if ex != nil {
|
||||||
return nil, err
|
select {
|
||||||
|
case <-time.After(ex.delay):
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &statement{c, ex, query}, nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, ErrCancelled
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
return nil, err
|
||||||
case <-time.After(ex.delay):
|
|
||||||
return &statement{c, ex, query}, nil
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil, ErrCancelled
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement the "Pinger" interface
|
// Implement the "Pinger" interface
|
||||||
@ -99,3 +113,9 @@ func (stmt *statement) QueryContext(ctx context.Context, args []driver.NamedValu
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @TODO maybe add ExpectedBegin.WithOptions(driver.TxOptions)
|
// @TODO maybe add ExpectedBegin.WithOptions(driver.TxOptions)
|
||||||
|
|
||||||
|
// CheckNamedValue meets https://golang.org/pkg/database/sql/driver/#NamedValueChecker
|
||||||
|
func (c *sqlmock) CheckNamedValue(nv *driver.NamedValue) (err error) {
|
||||||
|
nv.Value, err = c.converter.ConvertValue(nv.Value)
|
||||||
|
return err
|
||||||
|
}
|
5
vendor/github.com/golang/protobuf/proto/properties.go
generated
vendored
5
vendor/github.com/golang/protobuf/proto/properties.go
generated
vendored
@ -38,7 +38,6 @@ package proto
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -194,7 +193,7 @@ func (p *Properties) Parse(s string) {
|
|||||||
// "bytes,49,opt,name=foo,def=hello!"
|
// "bytes,49,opt,name=foo,def=hello!"
|
||||||
fields := strings.Split(s, ",") // breaks def=, but handled below.
|
fields := strings.Split(s, ",") // breaks def=, but handled below.
|
||||||
if len(fields) < 2 {
|
if len(fields) < 2 {
|
||||||
fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s)
|
log.Printf("proto: tag has too few fields: %q", s)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +213,7 @@ func (p *Properties) Parse(s string) {
|
|||||||
p.WireType = WireBytes
|
p.WireType = WireBytes
|
||||||
// no numeric converter for non-numeric types
|
// no numeric converter for non-numeric types
|
||||||
default:
|
default:
|
||||||
fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s)
|
log.Printf("proto: tag has unknown wire type: %q", s)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
vendor/github.com/konsorten/go-windows-terminal-sequences/README.md
generated
vendored
1
vendor/github.com/konsorten/go-windows-terminal-sequences/README.md
generated
vendored
@ -26,6 +26,7 @@ The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de).
|
|||||||
We thank all the authors who provided code to this library:
|
We thank all the authors who provided code to this library:
|
||||||
|
|
||||||
* Felix Kollmann
|
* Felix Kollmann
|
||||||
|
* Nicolas Perraut
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
11
vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go
generated
vendored
Normal file
11
vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// +build linux darwin
|
||||||
|
|
||||||
|
package sequences
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func EnableVirtualTerminalProcessing(stream uintptr, enable bool) error {
|
||||||
|
return fmt.Errorf("windows only package")
|
||||||
|
}
|
7
vendor/github.com/prometheus/procfs/Makefile.common
generated
vendored
7
vendor/github.com/prometheus/procfs/Makefile.common
generated
vendored
@ -86,6 +86,7 @@ endif
|
|||||||
PREFIX ?= $(shell pwd)
|
PREFIX ?= $(shell pwd)
|
||||||
BIN_DIR ?= $(shell pwd)
|
BIN_DIR ?= $(shell pwd)
|
||||||
DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
|
DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
|
||||||
|
DOCKERFILE_PATH ?= ./
|
||||||
DOCKER_REPO ?= prom
|
DOCKER_REPO ?= prom
|
||||||
|
|
||||||
DOCKER_ARCHS ?= amd64
|
DOCKER_ARCHS ?= amd64
|
||||||
@ -212,7 +213,7 @@ $(BUILD_DOCKER_ARCHS): common-docker-%:
|
|||||||
docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \
|
docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \
|
||||||
--build-arg ARCH="$*" \
|
--build-arg ARCH="$*" \
|
||||||
--build-arg OS="linux" \
|
--build-arg OS="linux" \
|
||||||
.
|
$(DOCKERFILE_PATH)
|
||||||
|
|
||||||
.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
|
.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
|
||||||
common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
|
common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
|
||||||
@ -247,7 +248,9 @@ proto:
|
|||||||
ifdef GOLANGCI_LINT
|
ifdef GOLANGCI_LINT
|
||||||
$(GOLANGCI_LINT):
|
$(GOLANGCI_LINT):
|
||||||
mkdir -p $(FIRST_GOPATH)/bin
|
mkdir -p $(FIRST_GOPATH)/bin
|
||||||
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION)
|
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \
|
||||||
|
| sed -e '/install -d/d' \
|
||||||
|
| sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef GOVENDOR
|
ifdef GOVENDOR
|
||||||
|
551
vendor/github.com/prometheus/procfs/fixtures.ttar
generated
vendored
551
vendor/github.com/prometheus/procfs/fixtures.ttar
generated
vendored
@ -3,7 +3,7 @@ Directory: fixtures
|
|||||||
Mode: 775
|
Mode: 775
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: fixtures/proc
|
Directory: fixtures/proc
|
||||||
Mode: 755
|
Mode: 775
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: fixtures/proc/26231
|
Directory: fixtures/proc/26231
|
||||||
Mode: 755
|
Mode: 755
|
||||||
@ -21,6 +21,11 @@ Mode: 644
|
|||||||
Path: fixtures/proc/26231/cwd
|
Path: fixtures/proc/26231/cwd
|
||||||
SymlinkTo: /usr/bin
|
SymlinkTo: /usr/bin
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/proc/26231/environ
|
||||||
|
Lines: 1
|
||||||
|
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNULLBYTEHOSTNAME=cd24e11f73a5NULLBYTETERM=xtermNULLBYTEGOLANG_VERSION=1.12.5NULLBYTEGOPATH=/goNULLBYTEHOME=/rootNULLBYTEEOF
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Path: fixtures/proc/26231/exe
|
Path: fixtures/proc/26231/exe
|
||||||
SymlinkTo: /usr/bin/vim
|
SymlinkTo: /usr/bin/vim
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
@ -356,32 +361,62 @@ debug 0
|
|||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Path: fixtures/proc/mdstat
|
Path: fixtures/proc/mdstat
|
||||||
Lines: 26
|
Lines: 56
|
||||||
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
|
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
|
||||||
md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9]
|
|
||||||
|
md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S)
|
||||||
5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU]
|
5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU]
|
||||||
|
|
||||||
md127 : active raid1 sdi2[0] sdj2[1]
|
md127 : active raid1 sdi2[0] sdj2[1]
|
||||||
312319552 blocks [2/2] [UU]
|
312319552 blocks [2/2] [UU]
|
||||||
|
|
||||||
md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1]
|
md0 : active raid1 sdi1[0] sdj1[1]
|
||||||
248896 blocks [2/2] [UU]
|
248896 blocks [2/2] [UU]
|
||||||
|
|
||||||
md4 : inactive raid1 sda3[0] sdb3[1]
|
md4 : inactive raid1 sda3[0](F) sdb3[1](S)
|
||||||
4883648 blocks [2/2] [UU]
|
4883648 blocks [2/2] [UU]
|
||||||
|
|
||||||
md6 : active raid1 sdb2[2] sda2[0]
|
md6 : active raid1 sdb2[2](F) sdc[1](S) sda2[0]
|
||||||
195310144 blocks [2/1] [U_]
|
195310144 blocks [2/1] [U_]
|
||||||
[=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec
|
[=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec
|
||||||
|
|
||||||
md8 : active raid1 sdb1[1] sda1[0]
|
md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S)
|
||||||
195310144 blocks [2/2] [UU]
|
195310144 blocks [2/2] [UU]
|
||||||
[=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec
|
[=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec
|
||||||
|
|
||||||
md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1]
|
md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F)
|
||||||
7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU]
|
7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU]
|
||||||
bitmap: 0/30 pages [0KB], 65536KB chunk
|
bitmap: 0/30 pages [0KB], 65536KB chunk
|
||||||
|
|
||||||
|
md9 : active raid1 sdc2[2] sdd2[3] sdb2[1] sda2[0] sde[4](F) sdf[5](F) sdg[6](S)
|
||||||
|
523968 blocks super 1.2 [4/4] [UUUU]
|
||||||
|
resync=DELAYED
|
||||||
|
|
||||||
|
md10 : active raid0 sda1[0] sdb1[1]
|
||||||
|
314159265 blocks 64k chunks
|
||||||
|
|
||||||
|
md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1] sdc3[2](F) hda[4](S) ssdc2[3](S)
|
||||||
|
4190208 blocks super 1.2 [2/2] [UU]
|
||||||
|
resync=PENDING
|
||||||
|
|
||||||
|
md12 : active raid0 sdc2[0] sdd2[1]
|
||||||
|
3886394368 blocks super 1.2 512k chunks
|
||||||
|
|
||||||
|
md126 : active raid0 sdb[1] sdc[0]
|
||||||
|
1855870976 blocks super external:/md127/0 128k chunks
|
||||||
|
|
||||||
|
md219 : inactive sdb[2](S) sdc[1](S) sda[0](S)
|
||||||
|
7932 blocks super external:imsm
|
||||||
|
|
||||||
|
md00 : active raid0 xvdb[0]
|
||||||
|
4186624 blocks super 1.2 256k chunks
|
||||||
|
|
||||||
|
md120 : active linear sda1[1] sdb1[0]
|
||||||
|
2095104 blocks super 1.2 0k rounding
|
||||||
|
|
||||||
|
md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0]
|
||||||
|
322560 blocks super 1.2 512k chunks
|
||||||
|
|
||||||
unused devices: <none>
|
unused devices: <none>
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
@ -609,6 +644,232 @@ Mode: 664
|
|||||||
Directory: fixtures/sys/class
|
Directory: fixtures/sys/class
|
||||||
Mode: 775
|
Mode: 775
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/board_id
|
||||||
|
Lines: 1
|
||||||
|
SM_1141000001000
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver
|
||||||
|
Lines: 1
|
||||||
|
2.31.5050
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/hca_type
|
||||||
|
Lines: 1
|
||||||
|
MT4099
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0/ports
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data
|
||||||
|
Lines: 1
|
||||||
|
2221223609
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets
|
||||||
|
Lines: 1
|
||||||
|
87169372
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data
|
||||||
|
Lines: 1
|
||||||
|
26509113295
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets
|
||||||
|
Lines: 1
|
||||||
|
85734114
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait
|
||||||
|
Lines: 1
|
||||||
|
3599
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state
|
||||||
|
Lines: 1
|
||||||
|
5: LinkUp
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate
|
||||||
|
Lines: 1
|
||||||
|
40 Gb/sec (4X QDR)
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state
|
||||||
|
Lines: 1
|
||||||
|
4: ACTIVE
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_downed
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_error_recovery
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/local_link_integrity_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_constraint_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_data
|
||||||
|
Lines: 1
|
||||||
|
2460436784
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_packets
|
||||||
|
Lines: 1
|
||||||
|
89332064
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_remote_physical_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_switch_relay_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_constraint_errors
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_data
|
||||||
|
Lines: 1
|
||||||
|
26540356890
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_discards
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_packets
|
||||||
|
Lines: 1
|
||||||
|
88622850
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_wait
|
||||||
|
Lines: 1
|
||||||
|
3846
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error
|
||||||
|
Lines: 1
|
||||||
|
0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state
|
||||||
|
Lines: 1
|
||||||
|
5: LinkUp
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/rate
|
||||||
|
Lines: 1
|
||||||
|
40 Gb/sec (4X QDR)
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/state
|
||||||
|
Lines: 1
|
||||||
|
4: ACTIVE
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: fixtures/sys/class/net
|
Directory: fixtures/sys/class/net
|
||||||
Mode: 775
|
Mode: 775
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
@ -1182,6 +1443,35 @@ Lines: 1
|
|||||||
0
|
0
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/devices/rbd
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/devices/rbd/0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/devices/rbd/0/name
|
||||||
|
Lines: 1
|
||||||
|
demo
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/devices/rbd/0/pool
|
||||||
|
Lines: 1
|
||||||
|
iscsi-images
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/devices/rbd/1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/devices/rbd/1/name
|
||||||
|
Lines: 1
|
||||||
|
wrong
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/devices/rbd/1/pool
|
||||||
|
Lines: 1
|
||||||
|
wrong-images
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: fixtures/sys/devices/system
|
Directory: fixtures/sys/devices/system
|
||||||
Mode: 775
|
Mode: 775
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
@ -1806,3 +2096,248 @@ Lines: 1
|
|||||||
extent_alloc 2 0 0 0
|
extent_alloc 2 0 0 0
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/fileio_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/fileio_1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/udev_path
|
||||||
|
Lines: 1
|
||||||
|
/home/iscsi/file_back_1G
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/iblock_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/udev_path
|
||||||
|
Lines: 1
|
||||||
|
/dev/rbd1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/rbd_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/udev_path
|
||||||
|
Lines: 1
|
||||||
|
/dev/rbd/iscsi-images/demo
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/udev_path
|
||||||
|
Lines: 0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/7f4a4eb56d
|
||||||
|
SymlinkTo: ../../../../../../target/core/rd_mcp_119/ramdisk_lio_1G
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds
|
||||||
|
Lines: 1
|
||||||
|
204950
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes
|
||||||
|
Lines: 1
|
||||||
|
10325
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes
|
||||||
|
Lines: 1
|
||||||
|
40325
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/795b7c7026
|
||||||
|
SymlinkTo: ../../../../../../target/core/iblock_0/block_lio_rbd1
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds
|
||||||
|
Lines: 1
|
||||||
|
104950
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes
|
||||||
|
Lines: 1
|
||||||
|
20095
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes
|
||||||
|
Lines: 1
|
||||||
|
71235
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/fff5e16686
|
||||||
|
SymlinkTo: ../../../../../../target/core/fileio_1/file_lio_1G
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds
|
||||||
|
Lines: 1
|
||||||
|
301950
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes
|
||||||
|
Lines: 1
|
||||||
|
10195
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes
|
||||||
|
Lines: 1
|
||||||
|
30195
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/enable
|
||||||
|
Lines: 1
|
||||||
|
1
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/eba1edf893
|
||||||
|
SymlinkTo: ../../../../../../target/core/rbd_0/iscsi-images-demo
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port
|
||||||
|
Mode: 755
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds
|
||||||
|
Lines: 1
|
||||||
|
1234
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes
|
||||||
|
Lines: 1
|
||||||
|
1504
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes
|
||||||
|
Lines: 1
|
||||||
|
4733
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
5
vendor/github.com/prometheus/procfs/go.mod
generated
vendored
5
vendor/github.com/prometheus/procfs/go.mod
generated
vendored
@ -1,3 +1,6 @@
|
|||||||
module github.com/prometheus/procfs
|
module github.com/prometheus/procfs
|
||||||
|
|
||||||
require golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4
|
require (
|
||||||
|
github.com/google/go-cmp v0.3.0
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4
|
||||||
|
)
|
||||||
|
2
vendor/github.com/prometheus/procfs/go.sum
generated
vendored
2
vendor/github.com/prometheus/procfs/go.sum
generated
vendored
@ -1,2 +1,4 @@
|
|||||||
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
3
vendor/github.com/prometheus/procfs/internal/fs/fs.go
generated
vendored
3
vendor/github.com/prometheus/procfs/internal/fs/fs.go
generated
vendored
@ -25,6 +25,9 @@ const (
|
|||||||
|
|
||||||
// DefaultSysMountPoint is the common mount point of the sys filesystem.
|
// DefaultSysMountPoint is the common mount point of the sys filesystem.
|
||||||
DefaultSysMountPoint = "/sys"
|
DefaultSysMountPoint = "/sys"
|
||||||
|
|
||||||
|
// DefaultConfigfsMountPoint is the commont mount point of the configfs
|
||||||
|
DefaultConfigfsMountPoint = "/sys/kernel/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FS represents a pseudo-filesystem, normally /proc or /sys, which provides an
|
// FS represents a pseudo-filesystem, normally /proc or /sys, which provides an
|
||||||
|
111
vendor/github.com/prometheus/procfs/mdstat.go
generated
vendored
111
vendor/github.com/prometheus/procfs/mdstat.go
generated
vendored
@ -22,8 +22,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`)
|
statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`)
|
||||||
buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`)
|
recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`)
|
||||||
)
|
)
|
||||||
|
|
||||||
// MDStat holds info parsed from /proc/mdstat.
|
// MDStat holds info parsed from /proc/mdstat.
|
||||||
@ -34,8 +34,12 @@ type MDStat struct {
|
|||||||
ActivityState string
|
ActivityState string
|
||||||
// Number of active disks.
|
// Number of active disks.
|
||||||
DisksActive int64
|
DisksActive int64
|
||||||
// Total number of disks the device consists of.
|
// Total number of disks the device requires.
|
||||||
DisksTotal int64
|
DisksTotal int64
|
||||||
|
// Number of failed disks.
|
||||||
|
DisksFailed int64
|
||||||
|
// Spare disks in the device.
|
||||||
|
DisksSpare int64
|
||||||
// Number of blocks the device holds.
|
// Number of blocks the device holds.
|
||||||
BlocksTotal int64
|
BlocksTotal int64
|
||||||
// Number of blocks on the device that are in sync.
|
// Number of blocks on the device that are in sync.
|
||||||
@ -59,29 +63,38 @@ func (fs FS) MDStat() ([]MDStat, error) {
|
|||||||
|
|
||||||
// parseMDStat parses data from mdstat file (/proc/mdstat) and returns a slice of
|
// parseMDStat parses data from mdstat file (/proc/mdstat) and returns a slice of
|
||||||
// structs containing the relevant info.
|
// structs containing the relevant info.
|
||||||
func parseMDStat(mdstatData []byte) ([]MDStat, error) {
|
func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
mdStats := []MDStat{}
|
mdStats := []MDStat{}
|
||||||
lines := strings.Split(string(mdstatData), "\n")
|
lines := strings.Split(string(mdStatData), "\n")
|
||||||
for i, l := range lines {
|
|
||||||
if strings.TrimSpace(l) == "" || l[0] == ' ' ||
|
for i, line := range lines {
|
||||||
strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") {
|
if strings.TrimSpace(line) == "" || line[0] == ' ' ||
|
||||||
|
strings.HasPrefix(line, "Personalities") ||
|
||||||
|
strings.HasPrefix(line, "unused") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceFields := strings.Fields(l)
|
deviceFields := strings.Fields(line)
|
||||||
if len(deviceFields) < 3 {
|
if len(deviceFields) < 3 {
|
||||||
return nil, fmt.Errorf("not enough fields in mdline (expected at least 3): %s", l)
|
return nil, fmt.Errorf("not enough fields in mdline (expected at least 3): %s", line)
|
||||||
}
|
}
|
||||||
mdName := deviceFields[0]
|
mdName := deviceFields[0] // mdx
|
||||||
activityState := deviceFields[2]
|
state := deviceFields[2] // active or inactive
|
||||||
|
|
||||||
if len(lines) <= i+3 {
|
if len(lines) <= i+3 {
|
||||||
return mdStats, fmt.Errorf("missing lines for md device %s", mdName)
|
return nil, fmt.Errorf(
|
||||||
|
"error parsing %s: too few lines for md device",
|
||||||
|
mdName,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
active, total, size, err := evalStatusLine(lines[i+1])
|
// Failed disks have the suffix (F) & Spare disks have the suffix (S).
|
||||||
|
fail := int64(strings.Count(line, "(F)"))
|
||||||
|
spare := int64(strings.Count(line, "(S)"))
|
||||||
|
active, total, size, err := evalStatusLine(lines[i], lines[i+1])
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("error parsing md device lines: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
syncLineIdx := i + 2
|
syncLineIdx := i + 2
|
||||||
@ -89,20 +102,38 @@ func parseMDStat(mdstatData []byte) ([]MDStat, error) {
|
|||||||
syncLineIdx++
|
syncLineIdx++
|
||||||
}
|
}
|
||||||
|
|
||||||
// If device is recovering/syncing at the moment, get the number of currently
|
// If device is syncing at the moment, get the number of currently
|
||||||
// synced bytes, otherwise that number equals the size of the device.
|
// synced bytes, otherwise that number equals the size of the device.
|
||||||
syncedBlocks := size
|
syncedBlocks := size
|
||||||
if strings.Contains(lines[syncLineIdx], "recovery") || strings.Contains(lines[syncLineIdx], "resync") {
|
recovering := strings.Contains(lines[syncLineIdx], "recovery")
|
||||||
syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx])
|
resyncing := strings.Contains(lines[syncLineIdx], "resync")
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
// Append recovery and resyncing state info.
|
||||||
|
if recovering || resyncing {
|
||||||
|
if recovering {
|
||||||
|
state = "recovering"
|
||||||
|
} else {
|
||||||
|
state = "resyncing"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle case when resync=PENDING or resync=DELAYED.
|
||||||
|
if strings.Contains(lines[syncLineIdx], "PENDING") ||
|
||||||
|
strings.Contains(lines[syncLineIdx], "DELAYED") {
|
||||||
|
syncedBlocks = 0
|
||||||
|
} else {
|
||||||
|
syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx])
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error parsing sync line in md device %s: %s", mdName, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mdStats = append(mdStats, MDStat{
|
mdStats = append(mdStats, MDStat{
|
||||||
Name: mdName,
|
Name: mdName,
|
||||||
ActivityState: activityState,
|
ActivityState: state,
|
||||||
DisksActive: active,
|
DisksActive: active,
|
||||||
|
DisksFailed: fail,
|
||||||
|
DisksSpare: spare,
|
||||||
DisksTotal: total,
|
DisksTotal: total,
|
||||||
BlocksTotal: size,
|
BlocksTotal: size,
|
||||||
BlocksSynced: syncedBlocks,
|
BlocksSynced: syncedBlocks,
|
||||||
@ -112,39 +143,51 @@ func parseMDStat(mdstatData []byte) ([]MDStat, error) {
|
|||||||
return mdStats, nil
|
return mdStats, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func evalStatusLine(statusline string) (active, total, size int64, err error) {
|
func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, err error) {
|
||||||
matches := statuslineRE.FindStringSubmatch(statusline)
|
|
||||||
if len(matches) != 4 {
|
sizeStr := strings.Fields(statusLine)[0]
|
||||||
return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline)
|
size, err = strconv.ParseInt(sizeStr, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
size, err = strconv.ParseInt(matches[1], 10, 64)
|
if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") {
|
||||||
if err != nil {
|
// In the device deviceLine, only disks have a number associated with them in [].
|
||||||
return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err)
|
total = int64(strings.Count(deviceLine, "["))
|
||||||
|
return total, total, size, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(deviceLine, "inactive") {
|
||||||
|
return 0, 0, size, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
matches := statusLineRE.FindStringSubmatch(statusLine)
|
||||||
|
if len(matches) != 4 {
|
||||||
|
return 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
total, err = strconv.ParseInt(matches[2], 10, 64)
|
total, err = strconv.ParseInt(matches[2], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err)
|
return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
active, err = strconv.ParseInt(matches[3], 10, 64)
|
active, err = strconv.ParseInt(matches[3], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err)
|
return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return active, total, size, nil
|
return active, total, size, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func evalRecoveryLine(buildline string) (syncedBlocks int64, err error) {
|
func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, err error) {
|
||||||
matches := buildlineRE.FindStringSubmatch(buildline)
|
matches := recoveryLineRE.FindStringSubmatch(recoveryLine)
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
return 0, fmt.Errorf("unexpected buildline: %s", buildline)
|
return 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64)
|
syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("%s in buildline: %s", err, buildline)
|
return 0, fmt.Errorf("%s in recoveryLine: %s", err, recoveryLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
return syncedBlocks, nil
|
return syncedBlocks, nil
|
||||||
|
178
vendor/github.com/prometheus/procfs/mountinfo.go
generated
vendored
Normal file
178
vendor/github.com/prometheus/procfs/mountinfo.go
generated
vendored
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
// Copyright 2019 The Prometheus Authors
|
||||||
|
// 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 procfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var validOptionalFields = map[string]bool{
|
||||||
|
"shared": true,
|
||||||
|
"master": true,
|
||||||
|
"propagate_from": true,
|
||||||
|
"unbindable": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
// A MountInfo is a type that describes the details, options
|
||||||
|
// for each mount, parsed from /proc/self/mountinfo.
|
||||||
|
// The fields described in each entry of /proc/self/mountinfo
|
||||||
|
// is described in the following man page.
|
||||||
|
// http://man7.org/linux/man-pages/man5/proc.5.html
|
||||||
|
type MountInfo struct {
|
||||||
|
// Unique Id for the mount
|
||||||
|
MountId int
|
||||||
|
// The Id of the parent mount
|
||||||
|
ParentId int
|
||||||
|
// The value of `st_dev` for the files on this FS
|
||||||
|
MajorMinorVer string
|
||||||
|
// The pathname of the directory in the FS that forms
|
||||||
|
// the root for this mount
|
||||||
|
Root string
|
||||||
|
// The pathname of the mount point relative to the root
|
||||||
|
MountPoint string
|
||||||
|
// Mount options
|
||||||
|
Options map[string]string
|
||||||
|
// Zero or more optional fields
|
||||||
|
OptionalFields map[string]string
|
||||||
|
// The Filesystem type
|
||||||
|
FSType string
|
||||||
|
// FS specific information or "none"
|
||||||
|
Source string
|
||||||
|
// Superblock options
|
||||||
|
SuperOptions map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns part of the mountinfo line, if it exists, else an empty string.
|
||||||
|
func getStringSliceElement(parts []string, idx int, defaultValue string) string {
|
||||||
|
if idx >= len(parts) {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return parts[idx]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads each line of the mountinfo file, and returns a list of formatted MountInfo structs.
|
||||||
|
func parseMountInfo(r io.Reader) ([]*MountInfo, error) {
|
||||||
|
mounts := []*MountInfo{}
|
||||||
|
scanner := bufio.NewScanner(r)
|
||||||
|
for scanner.Scan() {
|
||||||
|
mountString := scanner.Text()
|
||||||
|
parsedMounts, err := parseMountInfoString(mountString)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
mounts = append(mounts, parsedMounts)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := scanner.Err()
|
||||||
|
return mounts, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses a mountinfo file line, and converts it to a MountInfo struct.
|
||||||
|
// An important check here is to see if the hyphen separator, as if it does not exist,
|
||||||
|
// it means that the line is malformed.
|
||||||
|
func parseMountInfoString(mountString string) (*MountInfo, error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// OptionalFields can be zero, hence these checks to ensure we do not populate the wrong values in the wrong spots
|
||||||
|
separatorIndex := strings.Index(mountString, "-")
|
||||||
|
if separatorIndex == -1 {
|
||||||
|
return nil, fmt.Errorf("no separator found in mountinfo string: %s", mountString)
|
||||||
|
}
|
||||||
|
beforeFields := strings.Fields(mountString[:separatorIndex])
|
||||||
|
afterFields := strings.Fields(mountString[separatorIndex+1:])
|
||||||
|
if (len(beforeFields) + len(afterFields)) < 7 {
|
||||||
|
return nil, fmt.Errorf("too few fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
mount := &MountInfo{
|
||||||
|
MajorMinorVer: getStringSliceElement(beforeFields, 2, ""),
|
||||||
|
Root: getStringSliceElement(beforeFields, 3, ""),
|
||||||
|
MountPoint: getStringSliceElement(beforeFields, 4, ""),
|
||||||
|
Options: mountOptionsParser(getStringSliceElement(beforeFields, 5, "")),
|
||||||
|
OptionalFields: nil,
|
||||||
|
FSType: getStringSliceElement(afterFields, 0, ""),
|
||||||
|
Source: getStringSliceElement(afterFields, 1, ""),
|
||||||
|
SuperOptions: mountOptionsParser(getStringSliceElement(afterFields, 2, "")),
|
||||||
|
}
|
||||||
|
|
||||||
|
mount.MountId, err = strconv.Atoi(getStringSliceElement(beforeFields, 0, ""))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse mount ID")
|
||||||
|
}
|
||||||
|
mount.ParentId, err = strconv.Atoi(getStringSliceElement(beforeFields, 1, ""))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse parent ID")
|
||||||
|
}
|
||||||
|
// Has optional fields, which is a space separated list of values.
|
||||||
|
// Example: shared:2 master:7
|
||||||
|
if len(beforeFields) > 6 {
|
||||||
|
mount.OptionalFields = make(map[string]string)
|
||||||
|
optionalFields := beforeFields[6:]
|
||||||
|
for _, field := range optionalFields {
|
||||||
|
optionSplit := strings.Split(field, ":")
|
||||||
|
target, value := optionSplit[0], ""
|
||||||
|
if len(optionSplit) == 2 {
|
||||||
|
value = optionSplit[1]
|
||||||
|
}
|
||||||
|
// Checks if the 'keys' in the optional fields in the mountinfo line are acceptable.
|
||||||
|
// Allowed 'keys' are shared, master, propagate_from, unbindable.
|
||||||
|
if _, ok := validOptionalFields[target]; ok {
|
||||||
|
mount.OptionalFields[target] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mount, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses the mount options, superblock options.
|
||||||
|
func mountOptionsParser(mountOptions string) map[string]string {
|
||||||
|
opts := make(map[string]string)
|
||||||
|
options := strings.Split(mountOptions, ",")
|
||||||
|
for _, opt := range options {
|
||||||
|
splitOption := strings.Split(opt, "=")
|
||||||
|
if len(splitOption) < 2 {
|
||||||
|
key := splitOption[0]
|
||||||
|
opts[key] = ""
|
||||||
|
} else {
|
||||||
|
key, value := splitOption[0], splitOption[1]
|
||||||
|
opts[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return opts
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieves mountinfo information from `/proc/self/mountinfo`.
|
||||||
|
func GetMounts() ([]*MountInfo, error) {
|
||||||
|
f, err := os.Open("/proc/self/mountinfo")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
return parseMountInfo(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieves mountinfo information from a processes' `/proc/<pid>/mountinfo`.
|
||||||
|
func GetProcMounts(pid int) ([]*MountInfo, error) {
|
||||||
|
f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
return parseMountInfo(f)
|
||||||
|
}
|
14
vendor/github.com/prometheus/procfs/proc.go
generated
vendored
14
vendor/github.com/prometheus/procfs/proc.go
generated
vendored
@ -247,6 +247,20 @@ func (p Proc) MountStats() ([]*Mount, error) {
|
|||||||
return parseMountStats(f)
|
return parseMountStats(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MountInfo retrieves mount information for mount points in a
|
||||||
|
// process's namespace.
|
||||||
|
// It supplies information missing in `/proc/self/mounts` and
|
||||||
|
// fixes various other problems with that file too.
|
||||||
|
func (p Proc) MountInfo() ([]*MountInfo, error) {
|
||||||
|
f, err := os.Open(p.path("mountinfo"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return parseMountInfo(f)
|
||||||
|
}
|
||||||
|
|
||||||
func (p Proc) fileDescriptors() ([]string, error) {
|
func (p Proc) fileDescriptors() ([]string, error) {
|
||||||
d, err := os.Open(p.path("fd"))
|
d, err := os.Open(p.path("fd"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
43
vendor/github.com/prometheus/procfs/proc_environ.go
generated
vendored
Normal file
43
vendor/github.com/prometheus/procfs/proc_environ.go
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2019 The Prometheus Authors
|
||||||
|
// 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 procfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Environ reads process environments from /proc/<pid>/environ
|
||||||
|
func (p Proc) Environ() ([]string, error) {
|
||||||
|
environments := make([]string, 0)
|
||||||
|
|
||||||
|
f, err := os.Open(p.path("environ"))
|
||||||
|
if err != nil {
|
||||||
|
return environments, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
data, err := ioutil.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
return environments, err
|
||||||
|
}
|
||||||
|
|
||||||
|
environments = strings.Split(string(data), "\000")
|
||||||
|
if len(environments) > 0 {
|
||||||
|
environments = environments[:len(environments)-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return environments, nil
|
||||||
|
}
|
2
vendor/github.com/prometheus/procfs/proc_stat.go
generated
vendored
2
vendor/github.com/prometheus/procfs/proc_stat.go
generated
vendored
@ -106,7 +106,7 @@ type ProcStat struct {
|
|||||||
|
|
||||||
// NewStat returns the current status information of the process.
|
// NewStat returns the current status information of the process.
|
||||||
//
|
//
|
||||||
// Deprecated: use NewStat() instead
|
// Deprecated: use p.Stat() instead
|
||||||
func (p Proc) NewStat() (ProcStat, error) {
|
func (p Proc) NewStat() (ProcStat, error) {
|
||||||
return p.Stat()
|
return p.Stat()
|
||||||
}
|
}
|
||||||
|
52
vendor/github.com/smartystreets/assertions/README.md
generated
vendored
52
vendor/github.com/smartystreets/assertions/README.md
generated
vendored
@ -8,6 +8,8 @@ referenced in goconvey's `convey` package
|
|||||||
(github.com/smartystreets/gunit) for use with the So(...) method. They can also
|
(github.com/smartystreets/gunit) for use with the So(...) method. They can also
|
||||||
be used in traditional Go test functions and even in applications.
|
be used in traditional Go test functions and even in applications.
|
||||||
|
|
||||||
|
https://smartystreets.com
|
||||||
|
|
||||||
Many of the assertions lean heavily on work done by Aaron Jacobs in his
|
Many of the assertions lean heavily on work done by Aaron Jacobs in his
|
||||||
excellent oglematchers library. (https://github.com/jacobsa/oglematchers) The
|
excellent oglematchers library. (https://github.com/jacobsa/oglematchers) The
|
||||||
ShouldResemble assertion leans heavily on work done by Daniel Jacques in his
|
ShouldResemble assertion leans heavily on work done by Daniel Jacques in his
|
||||||
@ -25,7 +27,7 @@ the assertions in this package from the convey package JSON results are very
|
|||||||
helpful and can be rendered in a DIFF view. In that case, this function will be
|
helpful and can be rendered in a DIFF view. In that case, this function will be
|
||||||
called with a true value to enable the JSON serialization. By default, the
|
called with a true value to enable the JSON serialization. By default, the
|
||||||
assertions in this package will not serializer a JSON result, making standalone
|
assertions in this package will not serializer a JSON result, making standalone
|
||||||
ussage more convenient.
|
usage more convenient.
|
||||||
|
|
||||||
#### func ShouldAlmostEqual
|
#### func ShouldAlmostEqual
|
||||||
|
|
||||||
@ -67,7 +69,7 @@ to "".
|
|||||||
```go
|
```go
|
||||||
func ShouldBeChronological(actual interface{}, expected ...interface{}) string
|
func ShouldBeChronological(actual interface{}, expected ...interface{}) string
|
||||||
```
|
```
|
||||||
ShouldBeChronological receives a []time.Time slice and asserts that the are in
|
ShouldBeChronological receives a []time.Time slice and asserts that they are in
|
||||||
chronological order starting with the first time.Time as the earliest.
|
chronological order starting with the first time.Time as the earliest.
|
||||||
|
|
||||||
#### func ShouldBeEmpty
|
#### func ShouldBeEmpty
|
||||||
@ -79,6 +81,15 @@ ShouldBeEmpty receives a single parameter (actual) and determines whether or not
|
|||||||
calling len(actual) would return `0`. It obeys the rules specified by the len
|
calling len(actual) would return `0`. It obeys the rules specified by the len
|
||||||
function for determining length: http://golang.org/pkg/builtin/#len
|
function for determining length: http://golang.org/pkg/builtin/#len
|
||||||
|
|
||||||
|
#### func ShouldBeError
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShouldBeError(actual interface{}, expected ...interface{}) string
|
||||||
|
```
|
||||||
|
ShouldBeError asserts that the first argument implements the error interface. It
|
||||||
|
also compares the first argument against the second argument if provided (which
|
||||||
|
must be an error message string or another error value).
|
||||||
|
|
||||||
#### func ShouldBeFalse
|
#### func ShouldBeFalse
|
||||||
|
|
||||||
```go
|
```go
|
||||||
@ -187,7 +198,19 @@ ends with the second.
|
|||||||
```go
|
```go
|
||||||
func ShouldEqual(actual interface{}, expected ...interface{}) string
|
func ShouldEqual(actual interface{}, expected ...interface{}) string
|
||||||
```
|
```
|
||||||
ShouldEqual receives exactly two parameters and does an equality check.
|
ShouldEqual receives exactly two parameters and does an equality check using the
|
||||||
|
following semantics: 1. If the expected and actual values implement an Equal
|
||||||
|
method in the form `func (this T) Equal(that T) bool` then call the method. If
|
||||||
|
true, they are equal. 2. The expected and actual values are judged equal or not
|
||||||
|
by oglematchers.Equals.
|
||||||
|
|
||||||
|
#### func ShouldEqualJSON
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShouldEqualJSON(actual interface{}, expected ...interface{}) string
|
||||||
|
```
|
||||||
|
ShouldEqualJSON receives exactly two parameters and does an equality check by
|
||||||
|
marshalling to JSON
|
||||||
|
|
||||||
#### func ShouldEqualTrimSpace
|
#### func ShouldEqualTrimSpace
|
||||||
|
|
||||||
@ -322,6 +345,14 @@ func ShouldNotBeBlank(actual interface{}, expected ...interface{}) string
|
|||||||
ShouldNotBeBlank receives exactly 1 string parameter and ensures that it is
|
ShouldNotBeBlank receives exactly 1 string parameter and ensures that it is
|
||||||
equal to "".
|
equal to "".
|
||||||
|
|
||||||
|
#### func ShouldNotBeChronological
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShouldNotBeChronological(actual interface{}, expected ...interface{}) string
|
||||||
|
```
|
||||||
|
ShouldNotBeChronological receives a []time.Time slice and asserts that they are
|
||||||
|
NOT in chronological order.
|
||||||
|
|
||||||
#### func ShouldNotBeEmpty
|
#### func ShouldNotBeEmpty
|
||||||
|
|
||||||
```go
|
```go
|
||||||
@ -349,6 +380,14 @@ func ShouldNotBeNil(actual interface{}, expected ...interface{}) string
|
|||||||
```
|
```
|
||||||
ShouldNotBeNil receives a single parameter and ensures that it is not nil.
|
ShouldNotBeNil receives a single parameter and ensures that it is not nil.
|
||||||
|
|
||||||
|
#### func ShouldNotBeZeroValue
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShouldNotBeZeroValue(actual interface{}, expected ...interface{}) string
|
||||||
|
```
|
||||||
|
ShouldBeZeroValue receives a single parameter and ensures that it is NOT the Go
|
||||||
|
equivalent of the default value, or "zero" value.
|
||||||
|
|
||||||
#### func ShouldNotContain
|
#### func ShouldNotContain
|
||||||
|
|
||||||
```go
|
```go
|
||||||
@ -386,7 +425,8 @@ does not end with the second.
|
|||||||
```go
|
```go
|
||||||
func ShouldNotEqual(actual interface{}, expected ...interface{}) string
|
func ShouldNotEqual(actual interface{}, expected ...interface{}) string
|
||||||
```
|
```
|
||||||
ShouldNotEqual receives exactly two parameters and does an inequality check.
|
ShouldNotEqual receives exactly two parameters and does an inequality check. See
|
||||||
|
ShouldEqual for details on how equality is determined.
|
||||||
|
|
||||||
#### func ShouldNotHappenOnOrBetween
|
#### func ShouldNotHappenOnOrBetween
|
||||||
|
|
||||||
@ -521,6 +561,10 @@ Example:
|
|||||||
log.Println(message)
|
log.Println(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
For an alternative implementation of So (that provides more flexible return
|
||||||
|
options) see the `So` function in the package at
|
||||||
|
github.com/smartystreets/assertions/assert.
|
||||||
|
|
||||||
#### type Assertion
|
#### type Assertion
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
4
vendor/github.com/smartystreets/assertions/collections.go
generated
vendored
4
vendor/github.com/smartystreets/assertions/collections.go
generated
vendored
@ -227,7 +227,7 @@ func ShouldHaveLength(actual interface{}, expected ...interface{}) string {
|
|||||||
if int64(value.Len()) == expectedLen {
|
if int64(value.Len()) == expectedLen {
|
||||||
return success
|
return success
|
||||||
} else {
|
} else {
|
||||||
return fmt.Sprintf(shouldHaveHadLength, actual, value.Len(), expectedLen)
|
return fmt.Sprintf(shouldHaveHadLength, expectedLen, value.Len(), actual)
|
||||||
}
|
}
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
elem := value.Elem()
|
elem := value.Elem()
|
||||||
@ -236,7 +236,7 @@ func ShouldHaveLength(actual interface{}, expected ...interface{}) string {
|
|||||||
if int64(elem.Len()) == expectedLen {
|
if int64(elem.Len()) == expectedLen {
|
||||||
return success
|
return success
|
||||||
} else {
|
} else {
|
||||||
return fmt.Sprintf(shouldHaveHadLength, actual, elem.Len(), expectedLen)
|
return fmt.Sprintf(shouldHaveHadLength, expectedLen, elem.Len(), actual)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
87
vendor/github.com/smartystreets/assertions/equality.go
generated
vendored
87
vendor/github.com/smartystreets/assertions/equality.go
generated
vendored
@ -1,6 +1,7 @@
|
|||||||
package assertions
|
package assertions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
@ -25,30 +26,31 @@ func ShouldEqual(actual interface{}, expected ...interface{}) string {
|
|||||||
func shouldEqual(actual, expected interface{}) (message string) {
|
func shouldEqual(actual, expected interface{}) (message string) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
message = serializer.serialize(expected, actual, fmt.Sprintf(shouldHaveBeenEqual, expected, actual))
|
message = serializer.serialize(expected, actual, composeEqualityMismatchMessage(expected, actual))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if specification := newEqualityMethodSpecification(expected, actual); specification.IsSatisfied() {
|
if spec := newEqualityMethodSpecification(expected, actual); spec.IsSatisfied() && spec.AreEqual() {
|
||||||
if specification.AreEqual() {
|
return success
|
||||||
return success
|
} else if matchError := oglematchers.Equals(expected).Matches(actual); matchError == nil {
|
||||||
} else {
|
return success
|
||||||
message = fmt.Sprintf(shouldHaveBeenEqual, expected, actual)
|
|
||||||
return serializer.serialize(expected, actual, message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if matchError := oglematchers.Equals(expected).Matches(actual); matchError != nil {
|
|
||||||
expectedSyntax := fmt.Sprintf("%v", expected)
|
|
||||||
actualSyntax := fmt.Sprintf("%v", actual)
|
|
||||||
if expectedSyntax == actualSyntax && reflect.TypeOf(expected) != reflect.TypeOf(actual) {
|
|
||||||
message = fmt.Sprintf(shouldHaveBeenEqualTypeMismatch, expected, expected, actual, actual)
|
|
||||||
} else {
|
|
||||||
message = fmt.Sprintf(shouldHaveBeenEqual, expected, actual)
|
|
||||||
}
|
|
||||||
return serializer.serialize(expected, actual, message)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return success
|
return serializer.serialize(expected, actual, composeEqualityMismatchMessage(expected, actual))
|
||||||
|
}
|
||||||
|
func composeEqualityMismatchMessage(expected, actual interface{}) string {
|
||||||
|
var (
|
||||||
|
renderedExpected = fmt.Sprintf("%v", expected)
|
||||||
|
renderedActual = fmt.Sprintf("%v", actual)
|
||||||
|
)
|
||||||
|
|
||||||
|
if renderedExpected != renderedActual {
|
||||||
|
return fmt.Sprintf(shouldHaveBeenEqual+composePrettyDiff(renderedExpected, renderedActual), expected, actual)
|
||||||
|
} else if reflect.TypeOf(expected) != reflect.TypeOf(actual) {
|
||||||
|
return fmt.Sprintf(shouldHaveBeenEqualTypeMismatch, expected, expected, actual, actual)
|
||||||
|
} else {
|
||||||
|
return fmt.Sprintf(shouldHaveBeenEqualNoResemblance, renderedExpected)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShouldNotEqual receives exactly two parameters and does an inequality check.
|
// ShouldNotEqual receives exactly two parameters and does an inequality check.
|
||||||
@ -149,6 +151,34 @@ func getFloat(num interface{}) (float64, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShouldEqualJSON receives exactly two parameters and does an equality check by marshalling to JSON
|
||||||
|
func ShouldEqualJSON(actual interface{}, expected ...interface{}) string {
|
||||||
|
if message := need(1, expected); message != success {
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedString, expectedErr := remarshal(expected[0].(string))
|
||||||
|
if expectedErr != nil {
|
||||||
|
return "Expected value not valid JSON: " + expectedErr.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
actualString, actualErr := remarshal(actual.(string))
|
||||||
|
if actualErr != nil {
|
||||||
|
return "Actual value not valid JSON: " + actualErr.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
return ShouldEqual(actualString, expectedString)
|
||||||
|
}
|
||||||
|
func remarshal(value string) (string, error) {
|
||||||
|
var structured interface{}
|
||||||
|
err := json.Unmarshal([]byte(value), &structured)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
canonical, _ := json.Marshal(structured)
|
||||||
|
return string(canonical), nil
|
||||||
|
}
|
||||||
|
|
||||||
// ShouldResemble receives exactly two parameters and does a deep equal check (see reflect.DeepEqual)
|
// ShouldResemble receives exactly two parameters and does a deep equal check (see reflect.DeepEqual)
|
||||||
func ShouldResemble(actual interface{}, expected ...interface{}) string {
|
func ShouldResemble(actual interface{}, expected ...interface{}) string {
|
||||||
if message := need(1, expected); message != success {
|
if message := need(1, expected); message != success {
|
||||||
@ -156,8 +186,10 @@ func ShouldResemble(actual interface{}, expected ...interface{}) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if matchError := oglematchers.DeepEquals(expected[0]).Matches(actual); matchError != nil {
|
if matchError := oglematchers.DeepEquals(expected[0]).Matches(actual); matchError != nil {
|
||||||
return serializer.serializeDetailed(expected[0], actual,
|
renderedExpected, renderedActual := render.Render(expected[0]), render.Render(actual)
|
||||||
fmt.Sprintf(shouldHaveResembled, render.Render(expected[0]), render.Render(actual)))
|
message := fmt.Sprintf(shouldHaveResembled, renderedExpected, renderedActual) +
|
||||||
|
composePrettyDiff(renderedExpected, renderedActual)
|
||||||
|
return serializer.serializeDetailed(expected[0], actual, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return success
|
return success
|
||||||
@ -284,3 +316,16 @@ func ShouldBeZeroValue(actual interface{}, expected ...interface{}) string {
|
|||||||
}
|
}
|
||||||
return success
|
return success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShouldBeZeroValue receives a single parameter and ensures that it is NOT
|
||||||
|
// the Go equivalent of the default value, or "zero" value.
|
||||||
|
func ShouldNotBeZeroValue(actual interface{}, expected ...interface{}) string {
|
||||||
|
if fail := need(0, expected); fail != success {
|
||||||
|
return fail
|
||||||
|
}
|
||||||
|
zeroVal := reflect.Zero(reflect.TypeOf(actual)).Interface()
|
||||||
|
if reflect.DeepEqual(zeroVal, actual) {
|
||||||
|
return serializer.serialize(zeroVal, actual, fmt.Sprintf(shouldNotHaveBeenZeroValue, actual))
|
||||||
|
}
|
||||||
|
return success
|
||||||
|
}
|
||||||
|
37
vendor/github.com/smartystreets/assertions/equality_diff.go
generated
vendored
Normal file
37
vendor/github.com/smartystreets/assertions/equality_diff.go
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package assertions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch"
|
||||||
|
)
|
||||||
|
|
||||||
|
func composePrettyDiff(expected, actual string) string {
|
||||||
|
diff := diffmatchpatch.New()
|
||||||
|
diffs := diff.DiffMain(expected, actual, false)
|
||||||
|
if prettyDiffIsLikelyToBeHelpful(diffs) {
|
||||||
|
return fmt.Sprintf("\nDiff: '%s'", diff.DiffPrettyText(diffs))
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// prettyDiffIsLikelyToBeHelpful returns true if the diff listing contains
|
||||||
|
// more 'equal' segments than 'deleted'/'inserted' segments.
|
||||||
|
func prettyDiffIsLikelyToBeHelpful(diffs []diffmatchpatch.Diff) bool {
|
||||||
|
equal, deleted, inserted := measureDiffTypeLengths(diffs)
|
||||||
|
return equal > deleted && equal > inserted
|
||||||
|
}
|
||||||
|
|
||||||
|
func measureDiffTypeLengths(diffs []diffmatchpatch.Diff) (equal, deleted, inserted int) {
|
||||||
|
for _, segment := range diffs {
|
||||||
|
switch segment.Type {
|
||||||
|
case diffmatchpatch.DiffEqual:
|
||||||
|
equal += len(segment.Text)
|
||||||
|
case diffmatchpatch.DiffDelete:
|
||||||
|
deleted += len(segment.Text)
|
||||||
|
case diffmatchpatch.DiffInsert:
|
||||||
|
inserted += len(segment.Text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return equal, deleted, inserted
|
||||||
|
}
|
2
vendor/github.com/smartystreets/assertions/filter.go
generated
vendored
2
vendor/github.com/smartystreets/assertions/filter.go
generated
vendored
@ -17,7 +17,7 @@ func need(needed int, expected []interface{}) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func atLeast(minimum int, expected []interface{}) string {
|
func atLeast(minimum int, expected []interface{}) string {
|
||||||
if len(expected) < 1 {
|
if len(expected) < minimum {
|
||||||
return needNonEmptyCollection
|
return needNonEmptyCollection
|
||||||
}
|
}
|
||||||
return success
|
return success
|
||||||
|
3
vendor/github.com/smartystreets/assertions/go.mod
generated
vendored
Normal file
3
vendor/github.com/smartystreets/assertions/go.mod
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module github.com/smartystreets/assertions
|
||||||
|
|
||||||
|
go 1.12
|
25
vendor/github.com/smartystreets/assertions/internal/go-diff/AUTHORS
generated
vendored
Normal file
25
vendor/github.com/smartystreets/assertions/internal/go-diff/AUTHORS
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# This is the official list of go-diff authors for copyright purposes.
|
||||||
|
# This file is distinct from the CONTRIBUTORS files.
|
||||||
|
# See the latter for an explanation.
|
||||||
|
|
||||||
|
# Names should be added to this file as
|
||||||
|
# Name or Organization <email address>
|
||||||
|
# The email address is not required for organizations.
|
||||||
|
|
||||||
|
# Please keep the list sorted.
|
||||||
|
|
||||||
|
Danny Yoo <dannyyoo@google.com>
|
||||||
|
James Kolb <jkolb@google.com>
|
||||||
|
Jonathan Amsterdam <jba@google.com>
|
||||||
|
Markus Zimmermann <markus.zimmermann@nethead.at> <markus.zimmermann@symflower.com> <zimmski@gmail.com>
|
||||||
|
Matt Kovars <akaskik@gmail.com>
|
||||||
|
Örjan Persson <orjan@spotify.com>
|
||||||
|
Osman Masood <oamasood@gmail.com>
|
||||||
|
Robert Carlsen <rwcarlsen@gmail.com>
|
||||||
|
Rory Flynn <roryflynn@users.noreply.github.com>
|
||||||
|
Sergi Mansilla <sergi.mansilla@gmail.com>
|
||||||
|
Shatrugna Sadhu <ssadhu@apcera.com>
|
||||||
|
Shawn Smith <shawnpsmith@gmail.com>
|
||||||
|
Stas Maksimov <maksimov@gmail.com>
|
||||||
|
Tor Arvid Lund <torarvid@gmail.com>
|
||||||
|
Zac Bergquist <zbergquist99@gmail.com>
|
32
vendor/github.com/smartystreets/assertions/internal/go-diff/CONTRIBUTORS
generated
vendored
Normal file
32
vendor/github.com/smartystreets/assertions/internal/go-diff/CONTRIBUTORS
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# This is the official list of people who can contribute
|
||||||
|
# (and typically have contributed) code to the go-diff
|
||||||
|
# repository.
|
||||||
|
#
|
||||||
|
# The AUTHORS file lists the copyright holders; this file
|
||||||
|
# lists people. For example, ACME Inc. employees would be listed here
|
||||||
|
# but not in AUTHORS, because ACME Inc. would hold the copyright.
|
||||||
|
#
|
||||||
|
# When adding J Random Contributor's name to this file,
|
||||||
|
# either J's name or J's organization's name should be
|
||||||
|
# added to the AUTHORS file.
|
||||||
|
#
|
||||||
|
# Names should be added to this file like so:
|
||||||
|
# Name <email address>
|
||||||
|
#
|
||||||
|
# Please keep the list sorted.
|
||||||
|
|
||||||
|
Danny Yoo <dannyyoo@google.com>
|
||||||
|
James Kolb <jkolb@google.com>
|
||||||
|
Jonathan Amsterdam <jba@google.com>
|
||||||
|
Markus Zimmermann <markus.zimmermann@nethead.at> <markus.zimmermann@symflower.com> <zimmski@gmail.com>
|
||||||
|
Matt Kovars <akaskik@gmail.com>
|
||||||
|
Örjan Persson <orjan@spotify.com>
|
||||||
|
Osman Masood <oamasood@gmail.com>
|
||||||
|
Robert Carlsen <rwcarlsen@gmail.com>
|
||||||
|
Rory Flynn <roryflynn@users.noreply.github.com>
|
||||||
|
Sergi Mansilla <sergi.mansilla@gmail.com>
|
||||||
|
Shatrugna Sadhu <ssadhu@apcera.com>
|
||||||
|
Shawn Smith <shawnpsmith@gmail.com>
|
||||||
|
Stas Maksimov <maksimov@gmail.com>
|
||||||
|
Tor Arvid Lund <torarvid@gmail.com>
|
||||||
|
Zac Bergquist <zbergquist99@gmail.com>
|
20
vendor/github.com/smartystreets/assertions/internal/go-diff/LICENSE
generated
vendored
Normal file
20
vendor/github.com/smartystreets/assertions/internal/go-diff/LICENSE
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Copyright (c) 2012-2016 The go-diff Authors. All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
|
1345
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/diff.go
generated
vendored
Normal file
1345
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/diff.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
46
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/diffmatchpatch.go
generated
vendored
Normal file
46
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/diffmatchpatch.go
generated
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||||||
|
// https://github.com/sergi/go-diff
|
||||||
|
// See the included LICENSE file for license details.
|
||||||
|
//
|
||||||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||||||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||||||
|
// http://code.google.com/p/google-diff-match-patch/
|
||||||
|
|
||||||
|
// Package diffmatchpatch offers robust algorithms to perform the operations required for synchronizing plain text.
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DiffMatchPatch holds the configuration for diff-match-patch operations.
|
||||||
|
type DiffMatchPatch struct {
|
||||||
|
// Number of seconds to map a diff before giving up (0 for infinity).
|
||||||
|
DiffTimeout time.Duration
|
||||||
|
// Cost of an empty edit operation in terms of edit characters.
|
||||||
|
DiffEditCost int
|
||||||
|
// How far to search for a match (0 = exact location, 1000+ = broad match). A match this many characters away from the expected location will add 1.0 to the score (0.0 is a perfect match).
|
||||||
|
MatchDistance int
|
||||||
|
// When deleting a large block of text (over ~64 characters), how close do the contents have to be to match the expected contents. (0.0 = perfection, 1.0 = very loose). Note that MatchThreshold controls how closely the end points of a delete need to match.
|
||||||
|
PatchDeleteThreshold float64
|
||||||
|
// Chunk size for context length.
|
||||||
|
PatchMargin int
|
||||||
|
// The number of bits in an int.
|
||||||
|
MatchMaxBits int
|
||||||
|
// At what point is no match declared (0.0 = perfection, 1.0 = very loose).
|
||||||
|
MatchThreshold float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new DiffMatchPatch object with default parameters.
|
||||||
|
func New() *DiffMatchPatch {
|
||||||
|
// Defaults.
|
||||||
|
return &DiffMatchPatch{
|
||||||
|
DiffTimeout: time.Second,
|
||||||
|
DiffEditCost: 4,
|
||||||
|
MatchThreshold: 0.5,
|
||||||
|
MatchDistance: 1000,
|
||||||
|
PatchDeleteThreshold: 0.5,
|
||||||
|
PatchMargin: 4,
|
||||||
|
MatchMaxBits: 32,
|
||||||
|
}
|
||||||
|
}
|
160
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/match.go
generated
vendored
Normal file
160
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/match.go
generated
vendored
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||||||
|
// https://github.com/sergi/go-diff
|
||||||
|
// See the included LICENSE file for license details.
|
||||||
|
//
|
||||||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||||||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||||||
|
// http://code.google.com/p/google-diff-match-patch/
|
||||||
|
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MatchMain locates the best instance of 'pattern' in 'text' near 'loc'.
|
||||||
|
// Returns -1 if no match found.
|
||||||
|
func (dmp *DiffMatchPatch) MatchMain(text, pattern string, loc int) int {
|
||||||
|
// Check for null inputs not needed since null can't be passed in C#.
|
||||||
|
|
||||||
|
loc = int(math.Max(0, math.Min(float64(loc), float64(len(text)))))
|
||||||
|
if text == pattern {
|
||||||
|
// Shortcut (potentially not guaranteed by the algorithm)
|
||||||
|
return 0
|
||||||
|
} else if len(text) == 0 {
|
||||||
|
// Nothing to match.
|
||||||
|
return -1
|
||||||
|
} else if loc+len(pattern) <= len(text) && text[loc:loc+len(pattern)] == pattern {
|
||||||
|
// Perfect match at the perfect spot! (Includes case of null pattern)
|
||||||
|
return loc
|
||||||
|
}
|
||||||
|
// Do a fuzzy compare.
|
||||||
|
return dmp.MatchBitap(text, pattern, loc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MatchBitap locates the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm.
|
||||||
|
// Returns -1 if no match was found.
|
||||||
|
func (dmp *DiffMatchPatch) MatchBitap(text, pattern string, loc int) int {
|
||||||
|
// Initialise the alphabet.
|
||||||
|
s := dmp.MatchAlphabet(pattern)
|
||||||
|
|
||||||
|
// Highest score beyond which we give up.
|
||||||
|
scoreThreshold := dmp.MatchThreshold
|
||||||
|
// Is there a nearby exact match? (speedup)
|
||||||
|
bestLoc := indexOf(text, pattern, loc)
|
||||||
|
if bestLoc != -1 {
|
||||||
|
scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc,
|
||||||
|
pattern), scoreThreshold)
|
||||||
|
// What about in the other direction? (speedup)
|
||||||
|
bestLoc = lastIndexOf(text, pattern, loc+len(pattern))
|
||||||
|
if bestLoc != -1 {
|
||||||
|
scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc,
|
||||||
|
pattern), scoreThreshold)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialise the bit arrays.
|
||||||
|
matchmask := 1 << uint((len(pattern) - 1))
|
||||||
|
bestLoc = -1
|
||||||
|
|
||||||
|
var binMin, binMid int
|
||||||
|
binMax := len(pattern) + len(text)
|
||||||
|
lastRd := []int{}
|
||||||
|
for d := 0; d < len(pattern); d++ {
|
||||||
|
// Scan for the best match; each iteration allows for one more error. Run a binary search to determine how far from 'loc' we can stray at this error level.
|
||||||
|
binMin = 0
|
||||||
|
binMid = binMax
|
||||||
|
for binMin < binMid {
|
||||||
|
if dmp.matchBitapScore(d, loc+binMid, loc, pattern) <= scoreThreshold {
|
||||||
|
binMin = binMid
|
||||||
|
} else {
|
||||||
|
binMax = binMid
|
||||||
|
}
|
||||||
|
binMid = (binMax-binMin)/2 + binMin
|
||||||
|
}
|
||||||
|
// Use the result from this iteration as the maximum for the next.
|
||||||
|
binMax = binMid
|
||||||
|
start := int(math.Max(1, float64(loc-binMid+1)))
|
||||||
|
finish := int(math.Min(float64(loc+binMid), float64(len(text))) + float64(len(pattern)))
|
||||||
|
|
||||||
|
rd := make([]int, finish+2)
|
||||||
|
rd[finish+1] = (1 << uint(d)) - 1
|
||||||
|
|
||||||
|
for j := finish; j >= start; j-- {
|
||||||
|
var charMatch int
|
||||||
|
if len(text) <= j-1 {
|
||||||
|
// Out of range.
|
||||||
|
charMatch = 0
|
||||||
|
} else if _, ok := s[text[j-1]]; !ok {
|
||||||
|
charMatch = 0
|
||||||
|
} else {
|
||||||
|
charMatch = s[text[j-1]]
|
||||||
|
}
|
||||||
|
|
||||||
|
if d == 0 {
|
||||||
|
// First pass: exact match.
|
||||||
|
rd[j] = ((rd[j+1] << 1) | 1) & charMatch
|
||||||
|
} else {
|
||||||
|
// Subsequent passes: fuzzy match.
|
||||||
|
rd[j] = ((rd[j+1]<<1)|1)&charMatch | (((lastRd[j+1] | lastRd[j]) << 1) | 1) | lastRd[j+1]
|
||||||
|
}
|
||||||
|
if (rd[j] & matchmask) != 0 {
|
||||||
|
score := dmp.matchBitapScore(d, j-1, loc, pattern)
|
||||||
|
// This match will almost certainly be better than any existing match. But check anyway.
|
||||||
|
if score <= scoreThreshold {
|
||||||
|
// Told you so.
|
||||||
|
scoreThreshold = score
|
||||||
|
bestLoc = j - 1
|
||||||
|
if bestLoc > loc {
|
||||||
|
// When passing loc, don't exceed our current distance from loc.
|
||||||
|
start = int(math.Max(1, float64(2*loc-bestLoc)))
|
||||||
|
} else {
|
||||||
|
// Already passed loc, downhill from here on in.
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if dmp.matchBitapScore(d+1, loc, loc, pattern) > scoreThreshold {
|
||||||
|
// No hope for a (better) match at greater error levels.
|
||||||
|
break
|
||||||
|
}
|
||||||
|
lastRd = rd
|
||||||
|
}
|
||||||
|
return bestLoc
|
||||||
|
}
|
||||||
|
|
||||||
|
// matchBitapScore computes and returns the score for a match with e errors and x location.
|
||||||
|
func (dmp *DiffMatchPatch) matchBitapScore(e, x, loc int, pattern string) float64 {
|
||||||
|
accuracy := float64(e) / float64(len(pattern))
|
||||||
|
proximity := math.Abs(float64(loc - x))
|
||||||
|
if dmp.MatchDistance == 0 {
|
||||||
|
// Dodge divide by zero error.
|
||||||
|
if proximity == 0 {
|
||||||
|
return accuracy
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1.0
|
||||||
|
}
|
||||||
|
return accuracy + (proximity / float64(dmp.MatchDistance))
|
||||||
|
}
|
||||||
|
|
||||||
|
// MatchAlphabet initialises the alphabet for the Bitap algorithm.
|
||||||
|
func (dmp *DiffMatchPatch) MatchAlphabet(pattern string) map[byte]int {
|
||||||
|
s := map[byte]int{}
|
||||||
|
charPattern := []byte(pattern)
|
||||||
|
for _, c := range charPattern {
|
||||||
|
_, ok := s[c]
|
||||||
|
if !ok {
|
||||||
|
s[c] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i := 0
|
||||||
|
|
||||||
|
for _, c := range charPattern {
|
||||||
|
value := s[c] | int(uint(1)<<uint((len(pattern)-i-1)))
|
||||||
|
s[c] = value
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
23
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/mathutil.go
generated
vendored
Normal file
23
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/mathutil.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||||||
|
// https://github.com/sergi/go-diff
|
||||||
|
// See the included LICENSE file for license details.
|
||||||
|
//
|
||||||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||||||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||||||
|
// http://code.google.com/p/google-diff-match-patch/
|
||||||
|
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
func min(x, y int) int {
|
||||||
|
if x < y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
|
func max(x, y int) int {
|
||||||
|
if x > y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
17
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/operation_string.go
generated
vendored
Normal file
17
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/operation_string.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Code generated by "stringer -type=Operation -trimprefix=Diff"; DO NOT EDIT.
|
||||||
|
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const _Operation_name = "DeleteEqualInsert"
|
||||||
|
|
||||||
|
var _Operation_index = [...]uint8{0, 6, 11, 17}
|
||||||
|
|
||||||
|
func (i Operation) String() string {
|
||||||
|
i -= -1
|
||||||
|
if i < 0 || i >= Operation(len(_Operation_index)-1) {
|
||||||
|
return fmt.Sprintf("Operation(%d)", i+-1)
|
||||||
|
}
|
||||||
|
return _Operation_name[_Operation_index[i]:_Operation_index[i+1]]
|
||||||
|
}
|
556
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/patch.go
generated
vendored
Normal file
556
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/patch.go
generated
vendored
Normal file
@ -0,0 +1,556 @@
|
|||||||
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||||||
|
// https://github.com/sergi/go-diff
|
||||||
|
// See the included LICENSE file for license details.
|
||||||
|
//
|
||||||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||||||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||||||
|
// http://code.google.com/p/google-diff-match-patch/
|
||||||
|
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"math"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Patch represents one patch operation.
|
||||||
|
type Patch struct {
|
||||||
|
diffs []Diff
|
||||||
|
Start1 int
|
||||||
|
Start2 int
|
||||||
|
Length1 int
|
||||||
|
Length2 int
|
||||||
|
}
|
||||||
|
|
||||||
|
// String emulates GNU diff's format.
|
||||||
|
// Header: @@ -382,8 +481,9 @@
|
||||||
|
// Indices are printed as 1-based, not 0-based.
|
||||||
|
func (p *Patch) String() string {
|
||||||
|
var coords1, coords2 string
|
||||||
|
|
||||||
|
if p.Length1 == 0 {
|
||||||
|
coords1 = strconv.Itoa(p.Start1) + ",0"
|
||||||
|
} else if p.Length1 == 1 {
|
||||||
|
coords1 = strconv.Itoa(p.Start1 + 1)
|
||||||
|
} else {
|
||||||
|
coords1 = strconv.Itoa(p.Start1+1) + "," + strconv.Itoa(p.Length1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.Length2 == 0 {
|
||||||
|
coords2 = strconv.Itoa(p.Start2) + ",0"
|
||||||
|
} else if p.Length2 == 1 {
|
||||||
|
coords2 = strconv.Itoa(p.Start2 + 1)
|
||||||
|
} else {
|
||||||
|
coords2 = strconv.Itoa(p.Start2+1) + "," + strconv.Itoa(p.Length2)
|
||||||
|
}
|
||||||
|
|
||||||
|
var text bytes.Buffer
|
||||||
|
_, _ = text.WriteString("@@ -" + coords1 + " +" + coords2 + " @@\n")
|
||||||
|
|
||||||
|
// Escape the body of the patch with %xx notation.
|
||||||
|
for _, aDiff := range p.diffs {
|
||||||
|
switch aDiff.Type {
|
||||||
|
case DiffInsert:
|
||||||
|
_, _ = text.WriteString("+")
|
||||||
|
case DiffDelete:
|
||||||
|
_, _ = text.WriteString("-")
|
||||||
|
case DiffEqual:
|
||||||
|
_, _ = text.WriteString(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1))
|
||||||
|
_, _ = text.WriteString("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
return unescaper.Replace(text.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchAddContext increases the context until it is unique, but doesn't let the pattern expand beyond MatchMaxBits.
|
||||||
|
func (dmp *DiffMatchPatch) PatchAddContext(patch Patch, text string) Patch {
|
||||||
|
if len(text) == 0 {
|
||||||
|
return patch
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern := text[patch.Start2 : patch.Start2+patch.Length1]
|
||||||
|
padding := 0
|
||||||
|
|
||||||
|
// Look for the first and last matches of pattern in text. If two different matches are found, increase the pattern length.
|
||||||
|
for strings.Index(text, pattern) != strings.LastIndex(text, pattern) &&
|
||||||
|
len(pattern) < dmp.MatchMaxBits-2*dmp.PatchMargin {
|
||||||
|
padding += dmp.PatchMargin
|
||||||
|
maxStart := max(0, patch.Start2-padding)
|
||||||
|
minEnd := min(len(text), patch.Start2+patch.Length1+padding)
|
||||||
|
pattern = text[maxStart:minEnd]
|
||||||
|
}
|
||||||
|
// Add one chunk for good luck.
|
||||||
|
padding += dmp.PatchMargin
|
||||||
|
|
||||||
|
// Add the prefix.
|
||||||
|
prefix := text[max(0, patch.Start2-padding):patch.Start2]
|
||||||
|
if len(prefix) != 0 {
|
||||||
|
patch.diffs = append([]Diff{Diff{DiffEqual, prefix}}, patch.diffs...)
|
||||||
|
}
|
||||||
|
// Add the suffix.
|
||||||
|
suffix := text[patch.Start2+patch.Length1 : min(len(text), patch.Start2+patch.Length1+padding)]
|
||||||
|
if len(suffix) != 0 {
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffEqual, suffix})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Roll back the start points.
|
||||||
|
patch.Start1 -= len(prefix)
|
||||||
|
patch.Start2 -= len(prefix)
|
||||||
|
// Extend the lengths.
|
||||||
|
patch.Length1 += len(prefix) + len(suffix)
|
||||||
|
patch.Length2 += len(prefix) + len(suffix)
|
||||||
|
|
||||||
|
return patch
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchMake computes a list of patches.
|
||||||
|
func (dmp *DiffMatchPatch) PatchMake(opt ...interface{}) []Patch {
|
||||||
|
if len(opt) == 1 {
|
||||||
|
diffs, _ := opt[0].([]Diff)
|
||||||
|
text1 := dmp.DiffText1(diffs)
|
||||||
|
return dmp.PatchMake(text1, diffs)
|
||||||
|
} else if len(opt) == 2 {
|
||||||
|
text1 := opt[0].(string)
|
||||||
|
switch t := opt[1].(type) {
|
||||||
|
case string:
|
||||||
|
diffs := dmp.DiffMain(text1, t, true)
|
||||||
|
if len(diffs) > 2 {
|
||||||
|
diffs = dmp.DiffCleanupSemantic(diffs)
|
||||||
|
diffs = dmp.DiffCleanupEfficiency(diffs)
|
||||||
|
}
|
||||||
|
return dmp.PatchMake(text1, diffs)
|
||||||
|
case []Diff:
|
||||||
|
return dmp.patchMake2(text1, t)
|
||||||
|
}
|
||||||
|
} else if len(opt) == 3 {
|
||||||
|
return dmp.PatchMake(opt[0], opt[2])
|
||||||
|
}
|
||||||
|
return []Patch{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// patchMake2 computes a list of patches to turn text1 into text2.
|
||||||
|
// text2 is not provided, diffs are the delta between text1 and text2.
|
||||||
|
func (dmp *DiffMatchPatch) patchMake2(text1 string, diffs []Diff) []Patch {
|
||||||
|
// Check for null inputs not needed since null can't be passed in C#.
|
||||||
|
patches := []Patch{}
|
||||||
|
if len(diffs) == 0 {
|
||||||
|
return patches // Get rid of the null case.
|
||||||
|
}
|
||||||
|
|
||||||
|
patch := Patch{}
|
||||||
|
charCount1 := 0 // Number of characters into the text1 string.
|
||||||
|
charCount2 := 0 // Number of characters into the text2 string.
|
||||||
|
// Start with text1 (prepatchText) and apply the diffs until we arrive at text2 (postpatchText). We recreate the patches one by one to determine context info.
|
||||||
|
prepatchText := text1
|
||||||
|
postpatchText := text1
|
||||||
|
|
||||||
|
for i, aDiff := range diffs {
|
||||||
|
if len(patch.diffs) == 0 && aDiff.Type != DiffEqual {
|
||||||
|
// A new patch starts here.
|
||||||
|
patch.Start1 = charCount1
|
||||||
|
patch.Start2 = charCount2
|
||||||
|
}
|
||||||
|
|
||||||
|
switch aDiff.Type {
|
||||||
|
case DiffInsert:
|
||||||
|
patch.diffs = append(patch.diffs, aDiff)
|
||||||
|
patch.Length2 += len(aDiff.Text)
|
||||||
|
postpatchText = postpatchText[:charCount2] +
|
||||||
|
aDiff.Text + postpatchText[charCount2:]
|
||||||
|
case DiffDelete:
|
||||||
|
patch.Length1 += len(aDiff.Text)
|
||||||
|
patch.diffs = append(patch.diffs, aDiff)
|
||||||
|
postpatchText = postpatchText[:charCount2] + postpatchText[charCount2+len(aDiff.Text):]
|
||||||
|
case DiffEqual:
|
||||||
|
if len(aDiff.Text) <= 2*dmp.PatchMargin &&
|
||||||
|
len(patch.diffs) != 0 && i != len(diffs)-1 {
|
||||||
|
// Small equality inside a patch.
|
||||||
|
patch.diffs = append(patch.diffs, aDiff)
|
||||||
|
patch.Length1 += len(aDiff.Text)
|
||||||
|
patch.Length2 += len(aDiff.Text)
|
||||||
|
}
|
||||||
|
if len(aDiff.Text) >= 2*dmp.PatchMargin {
|
||||||
|
// Time for a new patch.
|
||||||
|
if len(patch.diffs) != 0 {
|
||||||
|
patch = dmp.PatchAddContext(patch, prepatchText)
|
||||||
|
patches = append(patches, patch)
|
||||||
|
patch = Patch{}
|
||||||
|
// Unlike Unidiff, our patch lists have a rolling context. http://code.google.com/p/google-diff-match-patch/wiki/Unidiff Update prepatch text & pos to reflect the application of the just completed patch.
|
||||||
|
prepatchText = postpatchText
|
||||||
|
charCount1 = charCount2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the current character count.
|
||||||
|
if aDiff.Type != DiffInsert {
|
||||||
|
charCount1 += len(aDiff.Text)
|
||||||
|
}
|
||||||
|
if aDiff.Type != DiffDelete {
|
||||||
|
charCount2 += len(aDiff.Text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pick up the leftover patch if not empty.
|
||||||
|
if len(patch.diffs) != 0 {
|
||||||
|
patch = dmp.PatchAddContext(patch, prepatchText)
|
||||||
|
patches = append(patches, patch)
|
||||||
|
}
|
||||||
|
|
||||||
|
return patches
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchDeepCopy returns an array that is identical to a given an array of patches.
|
||||||
|
func (dmp *DiffMatchPatch) PatchDeepCopy(patches []Patch) []Patch {
|
||||||
|
patchesCopy := []Patch{}
|
||||||
|
for _, aPatch := range patches {
|
||||||
|
patchCopy := Patch{}
|
||||||
|
for _, aDiff := range aPatch.diffs {
|
||||||
|
patchCopy.diffs = append(patchCopy.diffs, Diff{
|
||||||
|
aDiff.Type,
|
||||||
|
aDiff.Text,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
patchCopy.Start1 = aPatch.Start1
|
||||||
|
patchCopy.Start2 = aPatch.Start2
|
||||||
|
patchCopy.Length1 = aPatch.Length1
|
||||||
|
patchCopy.Length2 = aPatch.Length2
|
||||||
|
patchesCopy = append(patchesCopy, patchCopy)
|
||||||
|
}
|
||||||
|
return patchesCopy
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchApply merges a set of patches onto the text. Returns a patched text, as well as an array of true/false values indicating which patches were applied.
|
||||||
|
func (dmp *DiffMatchPatch) PatchApply(patches []Patch, text string) (string, []bool) {
|
||||||
|
if len(patches) == 0 {
|
||||||
|
return text, []bool{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deep copy the patches so that no changes are made to originals.
|
||||||
|
patches = dmp.PatchDeepCopy(patches)
|
||||||
|
|
||||||
|
nullPadding := dmp.PatchAddPadding(patches)
|
||||||
|
text = nullPadding + text + nullPadding
|
||||||
|
patches = dmp.PatchSplitMax(patches)
|
||||||
|
|
||||||
|
x := 0
|
||||||
|
// delta keeps track of the offset between the expected and actual location of the previous patch. If there are patches expected at positions 10 and 20, but the first patch was found at 12, delta is 2 and the second patch has an effective expected position of 22.
|
||||||
|
delta := 0
|
||||||
|
results := make([]bool, len(patches))
|
||||||
|
for _, aPatch := range patches {
|
||||||
|
expectedLoc := aPatch.Start2 + delta
|
||||||
|
text1 := dmp.DiffText1(aPatch.diffs)
|
||||||
|
var startLoc int
|
||||||
|
endLoc := -1
|
||||||
|
if len(text1) > dmp.MatchMaxBits {
|
||||||
|
// PatchSplitMax will only provide an oversized pattern in the case of a monster delete.
|
||||||
|
startLoc = dmp.MatchMain(text, text1[:dmp.MatchMaxBits], expectedLoc)
|
||||||
|
if startLoc != -1 {
|
||||||
|
endLoc = dmp.MatchMain(text,
|
||||||
|
text1[len(text1)-dmp.MatchMaxBits:], expectedLoc+len(text1)-dmp.MatchMaxBits)
|
||||||
|
if endLoc == -1 || startLoc >= endLoc {
|
||||||
|
// Can't find valid trailing context. Drop this patch.
|
||||||
|
startLoc = -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
startLoc = dmp.MatchMain(text, text1, expectedLoc)
|
||||||
|
}
|
||||||
|
if startLoc == -1 {
|
||||||
|
// No match found. :(
|
||||||
|
results[x] = false
|
||||||
|
// Subtract the delta for this failed patch from subsequent patches.
|
||||||
|
delta -= aPatch.Length2 - aPatch.Length1
|
||||||
|
} else {
|
||||||
|
// Found a match. :)
|
||||||
|
results[x] = true
|
||||||
|
delta = startLoc - expectedLoc
|
||||||
|
var text2 string
|
||||||
|
if endLoc == -1 {
|
||||||
|
text2 = text[startLoc:int(math.Min(float64(startLoc+len(text1)), float64(len(text))))]
|
||||||
|
} else {
|
||||||
|
text2 = text[startLoc:int(math.Min(float64(endLoc+dmp.MatchMaxBits), float64(len(text))))]
|
||||||
|
}
|
||||||
|
if text1 == text2 {
|
||||||
|
// Perfect match, just shove the Replacement text in.
|
||||||
|
text = text[:startLoc] + dmp.DiffText2(aPatch.diffs) + text[startLoc+len(text1):]
|
||||||
|
} else {
|
||||||
|
// Imperfect match. Run a diff to get a framework of equivalent indices.
|
||||||
|
diffs := dmp.DiffMain(text1, text2, false)
|
||||||
|
if len(text1) > dmp.MatchMaxBits && float64(dmp.DiffLevenshtein(diffs))/float64(len(text1)) > dmp.PatchDeleteThreshold {
|
||||||
|
// The end points match, but the content is unacceptably bad.
|
||||||
|
results[x] = false
|
||||||
|
} else {
|
||||||
|
diffs = dmp.DiffCleanupSemanticLossless(diffs)
|
||||||
|
index1 := 0
|
||||||
|
for _, aDiff := range aPatch.diffs {
|
||||||
|
if aDiff.Type != DiffEqual {
|
||||||
|
index2 := dmp.DiffXIndex(diffs, index1)
|
||||||
|
if aDiff.Type == DiffInsert {
|
||||||
|
// Insertion
|
||||||
|
text = text[:startLoc+index2] + aDiff.Text + text[startLoc+index2:]
|
||||||
|
} else if aDiff.Type == DiffDelete {
|
||||||
|
// Deletion
|
||||||
|
startIndex := startLoc + index2
|
||||||
|
text = text[:startIndex] +
|
||||||
|
text[startIndex+dmp.DiffXIndex(diffs, index1+len(aDiff.Text))-index2:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if aDiff.Type != DiffDelete {
|
||||||
|
index1 += len(aDiff.Text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x++
|
||||||
|
}
|
||||||
|
// Strip the padding off.
|
||||||
|
text = text[len(nullPadding) : len(nullPadding)+(len(text)-2*len(nullPadding))]
|
||||||
|
return text, results
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchAddPadding adds some padding on text start and end so that edges can match something.
|
||||||
|
// Intended to be called only from within patchApply.
|
||||||
|
func (dmp *DiffMatchPatch) PatchAddPadding(patches []Patch) string {
|
||||||
|
paddingLength := dmp.PatchMargin
|
||||||
|
nullPadding := ""
|
||||||
|
for x := 1; x <= paddingLength; x++ {
|
||||||
|
nullPadding += string(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bump all the patches forward.
|
||||||
|
for i := range patches {
|
||||||
|
patches[i].Start1 += paddingLength
|
||||||
|
patches[i].Start2 += paddingLength
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add some padding on start of first diff.
|
||||||
|
if len(patches[0].diffs) == 0 || patches[0].diffs[0].Type != DiffEqual {
|
||||||
|
// Add nullPadding equality.
|
||||||
|
patches[0].diffs = append([]Diff{Diff{DiffEqual, nullPadding}}, patches[0].diffs...)
|
||||||
|
patches[0].Start1 -= paddingLength // Should be 0.
|
||||||
|
patches[0].Start2 -= paddingLength // Should be 0.
|
||||||
|
patches[0].Length1 += paddingLength
|
||||||
|
patches[0].Length2 += paddingLength
|
||||||
|
} else if paddingLength > len(patches[0].diffs[0].Text) {
|
||||||
|
// Grow first equality.
|
||||||
|
extraLength := paddingLength - len(patches[0].diffs[0].Text)
|
||||||
|
patches[0].diffs[0].Text = nullPadding[len(patches[0].diffs[0].Text):] + patches[0].diffs[0].Text
|
||||||
|
patches[0].Start1 -= extraLength
|
||||||
|
patches[0].Start2 -= extraLength
|
||||||
|
patches[0].Length1 += extraLength
|
||||||
|
patches[0].Length2 += extraLength
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add some padding on end of last diff.
|
||||||
|
last := len(patches) - 1
|
||||||
|
if len(patches[last].diffs) == 0 || patches[last].diffs[len(patches[last].diffs)-1].Type != DiffEqual {
|
||||||
|
// Add nullPadding equality.
|
||||||
|
patches[last].diffs = append(patches[last].diffs, Diff{DiffEqual, nullPadding})
|
||||||
|
patches[last].Length1 += paddingLength
|
||||||
|
patches[last].Length2 += paddingLength
|
||||||
|
} else if paddingLength > len(patches[last].diffs[len(patches[last].diffs)-1].Text) {
|
||||||
|
// Grow last equality.
|
||||||
|
lastDiff := patches[last].diffs[len(patches[last].diffs)-1]
|
||||||
|
extraLength := paddingLength - len(lastDiff.Text)
|
||||||
|
patches[last].diffs[len(patches[last].diffs)-1].Text += nullPadding[:extraLength]
|
||||||
|
patches[last].Length1 += extraLength
|
||||||
|
patches[last].Length2 += extraLength
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullPadding
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchSplitMax looks through the patches and breaks up any which are longer than the maximum limit of the match algorithm.
|
||||||
|
// Intended to be called only from within patchApply.
|
||||||
|
func (dmp *DiffMatchPatch) PatchSplitMax(patches []Patch) []Patch {
|
||||||
|
patchSize := dmp.MatchMaxBits
|
||||||
|
for x := 0; x < len(patches); x++ {
|
||||||
|
if patches[x].Length1 <= patchSize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bigpatch := patches[x]
|
||||||
|
// Remove the big old patch.
|
||||||
|
patches = append(patches[:x], patches[x+1:]...)
|
||||||
|
x--
|
||||||
|
|
||||||
|
Start1 := bigpatch.Start1
|
||||||
|
Start2 := bigpatch.Start2
|
||||||
|
precontext := ""
|
||||||
|
for len(bigpatch.diffs) != 0 {
|
||||||
|
// Create one of several smaller patches.
|
||||||
|
patch := Patch{}
|
||||||
|
empty := true
|
||||||
|
patch.Start1 = Start1 - len(precontext)
|
||||||
|
patch.Start2 = Start2 - len(precontext)
|
||||||
|
if len(precontext) != 0 {
|
||||||
|
patch.Length1 = len(precontext)
|
||||||
|
patch.Length2 = len(precontext)
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffEqual, precontext})
|
||||||
|
}
|
||||||
|
for len(bigpatch.diffs) != 0 && patch.Length1 < patchSize-dmp.PatchMargin {
|
||||||
|
diffType := bigpatch.diffs[0].Type
|
||||||
|
diffText := bigpatch.diffs[0].Text
|
||||||
|
if diffType == DiffInsert {
|
||||||
|
// Insertions are harmless.
|
||||||
|
patch.Length2 += len(diffText)
|
||||||
|
Start2 += len(diffText)
|
||||||
|
patch.diffs = append(patch.diffs, bigpatch.diffs[0])
|
||||||
|
bigpatch.diffs = bigpatch.diffs[1:]
|
||||||
|
empty = false
|
||||||
|
} else if diffType == DiffDelete && len(patch.diffs) == 1 && patch.diffs[0].Type == DiffEqual && len(diffText) > 2*patchSize {
|
||||||
|
// This is a large deletion. Let it pass in one chunk.
|
||||||
|
patch.Length1 += len(diffText)
|
||||||
|
Start1 += len(diffText)
|
||||||
|
empty = false
|
||||||
|
patch.diffs = append(patch.diffs, Diff{diffType, diffText})
|
||||||
|
bigpatch.diffs = bigpatch.diffs[1:]
|
||||||
|
} else {
|
||||||
|
// Deletion or equality. Only take as much as we can stomach.
|
||||||
|
diffText = diffText[:min(len(diffText), patchSize-patch.Length1-dmp.PatchMargin)]
|
||||||
|
|
||||||
|
patch.Length1 += len(diffText)
|
||||||
|
Start1 += len(diffText)
|
||||||
|
if diffType == DiffEqual {
|
||||||
|
patch.Length2 += len(diffText)
|
||||||
|
Start2 += len(diffText)
|
||||||
|
} else {
|
||||||
|
empty = false
|
||||||
|
}
|
||||||
|
patch.diffs = append(patch.diffs, Diff{diffType, diffText})
|
||||||
|
if diffText == bigpatch.diffs[0].Text {
|
||||||
|
bigpatch.diffs = bigpatch.diffs[1:]
|
||||||
|
} else {
|
||||||
|
bigpatch.diffs[0].Text =
|
||||||
|
bigpatch.diffs[0].Text[len(diffText):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Compute the head context for the next patch.
|
||||||
|
precontext = dmp.DiffText2(patch.diffs)
|
||||||
|
precontext = precontext[max(0, len(precontext)-dmp.PatchMargin):]
|
||||||
|
|
||||||
|
postcontext := ""
|
||||||
|
// Append the end context for this patch.
|
||||||
|
if len(dmp.DiffText1(bigpatch.diffs)) > dmp.PatchMargin {
|
||||||
|
postcontext = dmp.DiffText1(bigpatch.diffs)[:dmp.PatchMargin]
|
||||||
|
} else {
|
||||||
|
postcontext = dmp.DiffText1(bigpatch.diffs)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(postcontext) != 0 {
|
||||||
|
patch.Length1 += len(postcontext)
|
||||||
|
patch.Length2 += len(postcontext)
|
||||||
|
if len(patch.diffs) != 0 && patch.diffs[len(patch.diffs)-1].Type == DiffEqual {
|
||||||
|
patch.diffs[len(patch.diffs)-1].Text += postcontext
|
||||||
|
} else {
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffEqual, postcontext})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !empty {
|
||||||
|
x++
|
||||||
|
patches = append(patches[:x], append([]Patch{patch}, patches[x:]...)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return patches
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchToText takes a list of patches and returns a textual representation.
|
||||||
|
func (dmp *DiffMatchPatch) PatchToText(patches []Patch) string {
|
||||||
|
var text bytes.Buffer
|
||||||
|
for _, aPatch := range patches {
|
||||||
|
_, _ = text.WriteString(aPatch.String())
|
||||||
|
}
|
||||||
|
return text.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// PatchFromText parses a textual representation of patches and returns a List of Patch objects.
|
||||||
|
func (dmp *DiffMatchPatch) PatchFromText(textline string) ([]Patch, error) {
|
||||||
|
patches := []Patch{}
|
||||||
|
if len(textline) == 0 {
|
||||||
|
return patches, nil
|
||||||
|
}
|
||||||
|
text := strings.Split(textline, "\n")
|
||||||
|
textPointer := 0
|
||||||
|
patchHeader := regexp.MustCompile("^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$")
|
||||||
|
|
||||||
|
var patch Patch
|
||||||
|
var sign uint8
|
||||||
|
var line string
|
||||||
|
for textPointer < len(text) {
|
||||||
|
|
||||||
|
if !patchHeader.MatchString(text[textPointer]) {
|
||||||
|
return patches, errors.New("Invalid patch string: " + text[textPointer])
|
||||||
|
}
|
||||||
|
|
||||||
|
patch = Patch{}
|
||||||
|
m := patchHeader.FindStringSubmatch(text[textPointer])
|
||||||
|
|
||||||
|
patch.Start1, _ = strconv.Atoi(m[1])
|
||||||
|
if len(m[2]) == 0 {
|
||||||
|
patch.Start1--
|
||||||
|
patch.Length1 = 1
|
||||||
|
} else if m[2] == "0" {
|
||||||
|
patch.Length1 = 0
|
||||||
|
} else {
|
||||||
|
patch.Start1--
|
||||||
|
patch.Length1, _ = strconv.Atoi(m[2])
|
||||||
|
}
|
||||||
|
|
||||||
|
patch.Start2, _ = strconv.Atoi(m[3])
|
||||||
|
|
||||||
|
if len(m[4]) == 0 {
|
||||||
|
patch.Start2--
|
||||||
|
patch.Length2 = 1
|
||||||
|
} else if m[4] == "0" {
|
||||||
|
patch.Length2 = 0
|
||||||
|
} else {
|
||||||
|
patch.Start2--
|
||||||
|
patch.Length2, _ = strconv.Atoi(m[4])
|
||||||
|
}
|
||||||
|
textPointer++
|
||||||
|
|
||||||
|
for textPointer < len(text) {
|
||||||
|
if len(text[textPointer]) > 0 {
|
||||||
|
sign = text[textPointer][0]
|
||||||
|
} else {
|
||||||
|
textPointer++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
line = text[textPointer][1:]
|
||||||
|
line = strings.Replace(line, "+", "%2b", -1)
|
||||||
|
line, _ = url.QueryUnescape(line)
|
||||||
|
if sign == '-' {
|
||||||
|
// Deletion.
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffDelete, line})
|
||||||
|
} else if sign == '+' {
|
||||||
|
// Insertion.
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffInsert, line})
|
||||||
|
} else if sign == ' ' {
|
||||||
|
// Minor equality.
|
||||||
|
patch.diffs = append(patch.diffs, Diff{DiffEqual, line})
|
||||||
|
} else if sign == '@' {
|
||||||
|
// Start of next patch.
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
// WTF?
|
||||||
|
return patches, errors.New("Invalid patch mode '" + string(sign) + "' in: " + string(line))
|
||||||
|
}
|
||||||
|
textPointer++
|
||||||
|
}
|
||||||
|
|
||||||
|
patches = append(patches, patch)
|
||||||
|
}
|
||||||
|
return patches, nil
|
||||||
|
}
|
88
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/stringutil.go
generated
vendored
Normal file
88
vendor/github.com/smartystreets/assertions/internal/go-diff/diffmatchpatch/stringutil.go
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// Copyright (c) 2012-2016 The go-diff authors. All rights reserved.
|
||||||
|
// https://github.com/sergi/go-diff
|
||||||
|
// See the included LICENSE file for license details.
|
||||||
|
//
|
||||||
|
// go-diff is a Go implementation of Google's Diff, Match, and Patch library
|
||||||
|
// Original library is Copyright (c) 2006 Google Inc.
|
||||||
|
// http://code.google.com/p/google-diff-match-patch/
|
||||||
|
|
||||||
|
package diffmatchpatch
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"unicode/utf8"
|
||||||
|
)
|
||||||
|
|
||||||
|
// unescaper unescapes selected chars for compatibility with JavaScript's encodeURI.
|
||||||
|
// In speed critical applications this could be dropped since the receiving application will certainly decode these fine. Note that this function is case-sensitive. Thus "%3F" would not be unescaped. But this is ok because it is only called with the output of HttpUtility.UrlEncode which returns lowercase hex. Example: "%3f" -> "?", "%24" -> "$", etc.
|
||||||
|
var unescaper = strings.NewReplacer(
|
||||||
|
"%21", "!", "%7E", "~", "%27", "'",
|
||||||
|
"%28", "(", "%29", ")", "%3B", ";",
|
||||||
|
"%2F", "/", "%3F", "?", "%3A", ":",
|
||||||
|
"%40", "@", "%26", "&", "%3D", "=",
|
||||||
|
"%2B", "+", "%24", "$", "%2C", ",", "%23", "#", "%2A", "*")
|
||||||
|
|
||||||
|
// indexOf returns the first index of pattern in str, starting at str[i].
|
||||||
|
func indexOf(str string, pattern string, i int) int {
|
||||||
|
if i > len(str)-1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if i <= 0 {
|
||||||
|
return strings.Index(str, pattern)
|
||||||
|
}
|
||||||
|
ind := strings.Index(str[i:], pattern)
|
||||||
|
if ind == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return ind + i
|
||||||
|
}
|
||||||
|
|
||||||
|
// lastIndexOf returns the last index of pattern in str, starting at str[i].
|
||||||
|
func lastIndexOf(str string, pattern string, i int) int {
|
||||||
|
if i < 0 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if i >= len(str) {
|
||||||
|
return strings.LastIndex(str, pattern)
|
||||||
|
}
|
||||||
|
_, size := utf8.DecodeRuneInString(str[i:])
|
||||||
|
return strings.LastIndex(str[:i+size], pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
// runesIndexOf returns the index of pattern in target, starting at target[i].
|
||||||
|
func runesIndexOf(target, pattern []rune, i int) int {
|
||||||
|
if i > len(target)-1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if i <= 0 {
|
||||||
|
return runesIndex(target, pattern)
|
||||||
|
}
|
||||||
|
ind := runesIndex(target[i:], pattern)
|
||||||
|
if ind == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return ind + i
|
||||||
|
}
|
||||||
|
|
||||||
|
func runesEqual(r1, r2 []rune) bool {
|
||||||
|
if len(r1) != len(r2) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i, c := range r1 {
|
||||||
|
if c != r2[i] {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// runesIndex is the equivalent of strings.Index for rune slices.
|
||||||
|
func runesIndex(r1, r2 []rune) int {
|
||||||
|
last := len(r1) - len(r2)
|
||||||
|
for i := 0; i <= last; i++ {
|
||||||
|
if runesEqual(r1[i:i+len(r2)], r2) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
130
vendor/github.com/smartystreets/assertions/messages.go
generated
vendored
130
vendor/github.com/smartystreets/assertions/messages.go
generated
vendored
@ -1,75 +1,85 @@
|
|||||||
package assertions
|
package assertions
|
||||||
|
|
||||||
const ( // equality
|
const (
|
||||||
shouldHaveBeenEqual = "Expected: '%v'\nActual: '%v'\n(Should be equal)"
|
shouldHaveBeenEqual = "Expected: '%v'\nActual: '%v'\n(Should be equal)"
|
||||||
shouldNotHaveBeenEqual = "Expected '%v'\nto NOT equal '%v'\n(but it did)!"
|
shouldHaveBeenEqualNoResemblance = "Both the actual and expected values render equally ('%s') and their types are the same. Try using ShouldResemble instead."
|
||||||
shouldHaveBeenEqualTypeMismatch = "Expected: '%v' (%T)\nActual: '%v' (%T)\n(Should be equal, type mismatch)"
|
shouldNotHaveBeenEqual = "Expected '%v'\nto NOT equal '%v'\n(but it did)!"
|
||||||
shouldHaveBeenAlmostEqual = "Expected '%v' to almost equal '%v' (but it didn't)!"
|
shouldHaveBeenEqualTypeMismatch = "Expected: '%v' (%T)\nActual: '%v' (%T)\n(Should be equal, type mismatch)"
|
||||||
shouldHaveNotBeenAlmostEqual = "Expected '%v' to NOT almost equal '%v' (but it did)!"
|
|
||||||
shouldHaveResembled = "Expected: '%s'\nActual: '%s'\n(Should resemble)!"
|
shouldHaveBeenAlmostEqual = "Expected '%v' to almost equal '%v' (but it didn't)!"
|
||||||
shouldNotHaveResembled = "Expected '%#v'\nto NOT resemble '%#v'\n(but it did)!"
|
shouldHaveNotBeenAlmostEqual = "Expected '%v' to NOT almost equal '%v' (but it did)!"
|
||||||
shouldBePointers = "Both arguments should be pointers "
|
|
||||||
shouldHaveBeenNonNilPointer = shouldBePointers + "(the %s was %s)!"
|
shouldHaveResembled = "Expected: '%s'\nActual: '%s'\n(Should resemble)!"
|
||||||
shouldHavePointedTo = "Expected '%+v' (address: '%v') and '%+v' (address: '%v') to be the same address (but their weren't)!"
|
shouldNotHaveResembled = "Expected '%#v'\nto NOT resemble '%#v'\n(but it did)!"
|
||||||
shouldNotHavePointedTo = "Expected '%+v' and '%+v' to be different references (but they matched: '%v')!"
|
|
||||||
shouldHaveBeenNil = "Expected: nil\nActual: '%v'"
|
shouldBePointers = "Both arguments should be pointers "
|
||||||
shouldNotHaveBeenNil = "Expected '%+v' to NOT be nil (but it was)!"
|
shouldHaveBeenNonNilPointer = shouldBePointers + "(the %s was %s)!"
|
||||||
shouldHaveBeenTrue = "Expected: true\nActual: %v"
|
shouldHavePointedTo = "Expected '%+v' (address: '%v') and '%+v' (address: '%v') to be the same address (but their weren't)!"
|
||||||
shouldHaveBeenFalse = "Expected: false\nActual: %v"
|
shouldNotHavePointedTo = "Expected '%+v' and '%+v' to be different references (but they matched: '%v')!"
|
||||||
shouldHaveBeenZeroValue = "'%+v' should have been the zero value" //"Expected: (zero value)\nActual: %v"
|
|
||||||
)
|
shouldHaveBeenNil = "Expected: nil\nActual: '%v'"
|
||||||
|
shouldNotHaveBeenNil = "Expected '%+v' to NOT be nil (but it was)!"
|
||||||
|
|
||||||
|
shouldHaveBeenTrue = "Expected: true\nActual: %v"
|
||||||
|
shouldHaveBeenFalse = "Expected: false\nActual: %v"
|
||||||
|
|
||||||
|
shouldHaveBeenZeroValue = "'%+v' should have been the zero value" //"Expected: (zero value)\nActual: %v"
|
||||||
|
shouldNotHaveBeenZeroValue = "'%+v' should NOT have been the zero value"
|
||||||
|
|
||||||
|
shouldHaveBeenGreater = "Expected '%v' to be greater than '%v' (but it wasn't)!"
|
||||||
|
shouldHaveBeenGreaterOrEqual = "Expected '%v' to be greater than or equal to '%v' (but it wasn't)!"
|
||||||
|
|
||||||
|
shouldHaveBeenLess = "Expected '%v' to be less than '%v' (but it wasn't)!"
|
||||||
|
shouldHaveBeenLessOrEqual = "Expected '%v' to be less than or equal to '%v' (but it wasn't)!"
|
||||||
|
|
||||||
const ( // quantity comparisons
|
|
||||||
shouldHaveBeenGreater = "Expected '%v' to be greater than '%v' (but it wasn't)!"
|
|
||||||
shouldHaveBeenGreaterOrEqual = "Expected '%v' to be greater than or equal to '%v' (but it wasn't)!"
|
|
||||||
shouldHaveBeenLess = "Expected '%v' to be less than '%v' (but it wasn't)!"
|
|
||||||
shouldHaveBeenLessOrEqual = "Expected '%v' to be less than or equal to '%v' (but it wasn't)!"
|
|
||||||
shouldHaveBeenBetween = "Expected '%v' to be between '%v' and '%v' (but it wasn't)!"
|
shouldHaveBeenBetween = "Expected '%v' to be between '%v' and '%v' (but it wasn't)!"
|
||||||
shouldNotHaveBeenBetween = "Expected '%v' NOT to be between '%v' and '%v' (but it was)!"
|
shouldNotHaveBeenBetween = "Expected '%v' NOT to be between '%v' and '%v' (but it was)!"
|
||||||
shouldHaveDifferentUpperAndLower = "The lower and upper bounds must be different values (they were both '%v')."
|
shouldHaveDifferentUpperAndLower = "The lower and upper bounds must be different values (they were both '%v')."
|
||||||
shouldHaveBeenBetweenOrEqual = "Expected '%v' to be between '%v' and '%v' or equal to one of them (but it wasn't)!"
|
|
||||||
shouldNotHaveBeenBetweenOrEqual = "Expected '%v' NOT to be between '%v' and '%v' or equal to one of them (but it was)!"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ( // collections
|
shouldHaveBeenBetweenOrEqual = "Expected '%v' to be between '%v' and '%v' or equal to one of them (but it wasn't)!"
|
||||||
|
shouldNotHaveBeenBetweenOrEqual = "Expected '%v' NOT to be between '%v' and '%v' or equal to one of them (but it was)!"
|
||||||
|
|
||||||
shouldHaveContained = "Expected the container (%v) to contain: '%v' (but it didn't)!"
|
shouldHaveContained = "Expected the container (%v) to contain: '%v' (but it didn't)!"
|
||||||
shouldNotHaveContained = "Expected the container (%v) NOT to contain: '%v' (but it did)!"
|
shouldNotHaveContained = "Expected the container (%v) NOT to contain: '%v' (but it did)!"
|
||||||
shouldHaveContainedKey = "Expected the %v to contain the key: %v (but it didn't)!"
|
|
||||||
shouldNotHaveContainedKey = "Expected the %v NOT to contain the key: %v (but it did)!"
|
|
||||||
shouldHaveBeenIn = "Expected '%v' to be in the container (%v), but it wasn't!"
|
|
||||||
shouldNotHaveBeenIn = "Expected '%v' NOT to be in the container (%v), but it was!"
|
|
||||||
shouldHaveBeenAValidCollection = "You must provide a valid container (was %v)!"
|
shouldHaveBeenAValidCollection = "You must provide a valid container (was %v)!"
|
||||||
shouldHaveBeenAValidMap = "You must provide a valid map type (was %v)!"
|
|
||||||
shouldHaveBeenEmpty = "Expected %+v to be empty (but it wasn't)!"
|
|
||||||
shouldNotHaveBeenEmpty = "Expected %+v to NOT be empty (but it was)!"
|
|
||||||
shouldHaveBeenAValidInteger = "You must provide a valid integer (was %v)!"
|
|
||||||
shouldHaveBeenAValidLength = "You must provide a valid positive integer (was %v)!"
|
|
||||||
shouldHaveHadLength = "Expected %+v (length: %v) to have length equal to '%v', but it wasn't!"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ( // strings
|
shouldHaveContainedKey = "Expected the %v to contain the key: %v (but it didn't)!"
|
||||||
shouldHaveStartedWith = "Expected '%v'\nto start with '%v'\n(but it didn't)!"
|
shouldNotHaveContainedKey = "Expected the %v NOT to contain the key: %v (but it did)!"
|
||||||
shouldNotHaveStartedWith = "Expected '%v'\nNOT to start with '%v'\n(but it did)!"
|
shouldHaveBeenAValidMap = "You must provide a valid map type (was %v)!"
|
||||||
shouldHaveEndedWith = "Expected '%v'\nto end with '%v'\n(but it didn't)!"
|
|
||||||
shouldNotHaveEndedWith = "Expected '%v'\nNOT to end with '%v'\n(but it did)!"
|
shouldHaveBeenIn = "Expected '%v' to be in the container (%v), but it wasn't!"
|
||||||
shouldAllBeStrings = "All arguments to this assertion must be strings (you provided: %v)."
|
shouldNotHaveBeenIn = "Expected '%v' NOT to be in the container (%v), but it was!"
|
||||||
shouldBothBeStrings = "Both arguments to this assertion must be strings (you provided %v and %v)."
|
|
||||||
shouldBeString = "The argument to this assertion must be a string (you provided %v)."
|
shouldHaveBeenEmpty = "Expected %+v to be empty (but it wasn't)!"
|
||||||
|
shouldNotHaveBeenEmpty = "Expected %+v to NOT be empty (but it was)!"
|
||||||
|
|
||||||
|
shouldHaveBeenAValidInteger = "You must provide a valid integer (was %v)!"
|
||||||
|
shouldHaveBeenAValidLength = "You must provide a valid positive integer (was %v)!"
|
||||||
|
shouldHaveHadLength = "Expected collection to have length equal to [%v], but it's length was [%v] instead! contents: %+v"
|
||||||
|
|
||||||
|
shouldHaveStartedWith = "Expected '%v'\nto start with '%v'\n(but it didn't)!"
|
||||||
|
shouldNotHaveStartedWith = "Expected '%v'\nNOT to start with '%v'\n(but it did)!"
|
||||||
|
|
||||||
|
shouldHaveEndedWith = "Expected '%v'\nto end with '%v'\n(but it didn't)!"
|
||||||
|
shouldNotHaveEndedWith = "Expected '%v'\nNOT to end with '%v'\n(but it did)!"
|
||||||
|
|
||||||
|
shouldAllBeStrings = "All arguments to this assertion must be strings (you provided: %v)."
|
||||||
|
shouldBothBeStrings = "Both arguments to this assertion must be strings (you provided %v and %v)."
|
||||||
|
|
||||||
shouldHaveContainedSubstring = "Expected '%s' to contain substring '%s' (but it didn't)!"
|
shouldHaveContainedSubstring = "Expected '%s' to contain substring '%s' (but it didn't)!"
|
||||||
shouldNotHaveContainedSubstring = "Expected '%s' NOT to contain substring '%s' (but it did)!"
|
shouldNotHaveContainedSubstring = "Expected '%s' NOT to contain substring '%s' (but it did)!"
|
||||||
shouldHaveBeenBlank = "Expected '%s' to be blank (but it wasn't)!"
|
|
||||||
shouldNotHaveBeenBlank = "Expected value to NOT be blank (but it was)!"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ( // panics
|
shouldBeString = "The argument to this assertion must be a string (you provided %v)."
|
||||||
|
shouldHaveBeenBlank = "Expected '%s' to be blank (but it wasn't)!"
|
||||||
|
shouldNotHaveBeenBlank = "Expected value to NOT be blank (but it was)!"
|
||||||
|
|
||||||
shouldUseVoidNiladicFunction = "You must provide a void, niladic function as the first argument!"
|
shouldUseVoidNiladicFunction = "You must provide a void, niladic function as the first argument!"
|
||||||
shouldHavePanickedWith = "Expected func() to panic with '%v' (but it panicked with '%v')!"
|
|
||||||
shouldHavePanicked = "Expected func() to panic (but it didn't)!"
|
shouldHavePanicked = "Expected func() to panic (but it didn't)!"
|
||||||
shouldNotHavePanicked = "Expected func() NOT to panic (error: '%+v')!"
|
shouldNotHavePanicked = "Expected func() NOT to panic (error: '%+v')!"
|
||||||
shouldNotHavePanickedWith = "Expected func() NOT to panic with '%v' (but it did)!"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ( // type checking
|
shouldHavePanickedWith = "Expected func() to panic with '%v' (but it panicked with '%v')!"
|
||||||
|
shouldNotHavePanickedWith = "Expected func() NOT to panic with '%v' (but it did)!"
|
||||||
|
|
||||||
shouldHaveBeenA = "Expected '%v' to be: '%v' (but was: '%v')!"
|
shouldHaveBeenA = "Expected '%v' to be: '%v' (but was: '%v')!"
|
||||||
shouldNotHaveBeenA = "Expected '%v' to NOT be: '%v' (but it was)!"
|
shouldNotHaveBeenA = "Expected '%v' to NOT be: '%v' (but it was)!"
|
||||||
|
|
||||||
@ -80,17 +90,17 @@ const ( // type checking
|
|||||||
|
|
||||||
shouldBeError = "Expected an error value (but was '%v' instead)!"
|
shouldBeError = "Expected an error value (but was '%v' instead)!"
|
||||||
shouldBeErrorInvalidComparisonValue = "The final argument to this assertion must be a string or an error value (you provided: '%v')."
|
shouldBeErrorInvalidComparisonValue = "The final argument to this assertion must be a string or an error value (you provided: '%v')."
|
||||||
)
|
|
||||||
|
|
||||||
const ( // time comparisons
|
shouldUseTimes = "You must provide time instances as arguments to this assertion."
|
||||||
shouldUseTimes = "You must provide time instances as arguments to this assertion."
|
shouldUseTimeSlice = "You must provide a slice of time instances as the first argument to this assertion."
|
||||||
shouldUseTimeSlice = "You must provide a slice of time instances as the first argument to this assertion."
|
shouldUseDurationAndTime = "You must provide a duration and a time as arguments to this assertion."
|
||||||
shouldUseDurationAndTime = "You must provide a duration and a time as arguments to this assertion."
|
|
||||||
shouldHaveHappenedBefore = "Expected '%v' to happen before '%v' (it happened '%v' after)!"
|
shouldHaveHappenedBefore = "Expected '%v' to happen before '%v' (it happened '%v' after)!"
|
||||||
shouldHaveHappenedAfter = "Expected '%v' to happen after '%v' (it happened '%v' before)!"
|
shouldHaveHappenedAfter = "Expected '%v' to happen after '%v' (it happened '%v' before)!"
|
||||||
shouldHaveHappenedBetween = "Expected '%v' to happen between '%v' and '%v' (it happened '%v' outside threshold)!"
|
shouldHaveHappenedBetween = "Expected '%v' to happen between '%v' and '%v' (it happened '%v' outside threshold)!"
|
||||||
shouldNotHaveHappenedOnOrBetween = "Expected '%v' to NOT happen on or between '%v' and '%v' (but it did)!"
|
shouldNotHaveHappenedOnOrBetween = "Expected '%v' to NOT happen on or between '%v' and '%v' (but it did)!"
|
||||||
|
|
||||||
// format params: incorrect-index, previous-index, previous-time, incorrect-index, incorrect-time
|
// format params: incorrect-index, previous-index, previous-time, incorrect-index, incorrect-time
|
||||||
shouldHaveBeenChronological = "The 'Time' at index [%d] should have happened after the previous one (but it didn't!):\n [%d]: %s\n [%d]: %s (see, it happened before!)"
|
shouldHaveBeenChronological = "The 'Time' at index [%d] should have happened after the previous one (but it didn't!):\n [%d]: %s\n [%d]: %s (see, it happened before!)"
|
||||||
|
shouldNotHaveBeenchronological = "The provided times should NOT be chronological, but they were."
|
||||||
)
|
)
|
||||||
|
7
vendor/github.com/smartystreets/assertions/serializer.go
generated
vendored
7
vendor/github.com/smartystreets/assertions/serializer.go
generated
vendored
@ -3,6 +3,7 @@ package assertions
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/smartystreets/assertions/internal/go-render/render"
|
"github.com/smartystreets/assertions/internal/go-render/render"
|
||||||
)
|
)
|
||||||
@ -15,6 +16,9 @@ type Serializer interface {
|
|||||||
type failureSerializer struct{}
|
type failureSerializer struct{}
|
||||||
|
|
||||||
func (self *failureSerializer) serializeDetailed(expected, actual interface{}, message string) string {
|
func (self *failureSerializer) serializeDetailed(expected, actual interface{}, message string) string {
|
||||||
|
if index := strings.Index(message, " Diff:"); index > 0 {
|
||||||
|
message = message[:index]
|
||||||
|
}
|
||||||
view := FailureView{
|
view := FailureView{
|
||||||
Message: message,
|
Message: message,
|
||||||
Expected: render.Render(expected),
|
Expected: render.Render(expected),
|
||||||
@ -25,6 +29,9 @@ func (self *failureSerializer) serializeDetailed(expected, actual interface{}, m
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *failureSerializer) serialize(expected, actual interface{}, message string) string {
|
func (self *failureSerializer) serialize(expected, actual interface{}, message string) string {
|
||||||
|
if index := strings.Index(message, " Diff:"); index > 0 {
|
||||||
|
message = message[:index]
|
||||||
|
}
|
||||||
view := FailureView{
|
view := FailureView{
|
||||||
Message: message,
|
Message: message,
|
||||||
Expected: fmt.Sprintf("%+v", expected),
|
Expected: fmt.Sprintf("%+v", expected),
|
||||||
|
18
vendor/github.com/smartystreets/assertions/time.go
generated
vendored
18
vendor/github.com/smartystreets/assertions/time.go
generated
vendored
@ -178,7 +178,7 @@ func ShouldNotHappenWithin(actual interface{}, expected ...interface{}) string {
|
|||||||
return ShouldNotHappenOnOrBetween(actualTime, min, max)
|
return ShouldNotHappenOnOrBetween(actualTime, min, max)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShouldBeChronological receives a []time.Time slice and asserts that the are
|
// ShouldBeChronological receives a []time.Time slice and asserts that they are
|
||||||
// in chronological order starting with the first time.Time as the earliest.
|
// in chronological order starting with the first time.Time as the earliest.
|
||||||
func ShouldBeChronological(actual interface{}, expected ...interface{}) string {
|
func ShouldBeChronological(actual interface{}, expected ...interface{}) string {
|
||||||
if fail := need(0, expected); fail != success {
|
if fail := need(0, expected); fail != success {
|
||||||
@ -200,3 +200,19 @@ func ShouldBeChronological(actual interface{}, expected ...interface{}) string {
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShouldNotBeChronological receives a []time.Time slice and asserts that they are
|
||||||
|
// NOT in chronological order.
|
||||||
|
func ShouldNotBeChronological(actual interface{}, expected ...interface{}) string {
|
||||||
|
if fail := need(0, expected); fail != success {
|
||||||
|
return fail
|
||||||
|
}
|
||||||
|
if _, ok := actual.([]time.Time); !ok {
|
||||||
|
return shouldUseTimeSlice
|
||||||
|
}
|
||||||
|
result := ShouldBeChronological(actual, expected...)
|
||||||
|
if result != "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return shouldNotHaveBeenchronological
|
||||||
|
}
|
||||||
|
1
vendor/github.com/smartystreets/goconvey/convey/assertions.go
generated
vendored
1
vendor/github.com/smartystreets/goconvey/convey/assertions.go
generated
vendored
@ -16,6 +16,7 @@ var (
|
|||||||
ShouldBeTrue = assertions.ShouldBeTrue
|
ShouldBeTrue = assertions.ShouldBeTrue
|
||||||
ShouldBeFalse = assertions.ShouldBeFalse
|
ShouldBeFalse = assertions.ShouldBeFalse
|
||||||
ShouldBeZeroValue = assertions.ShouldBeZeroValue
|
ShouldBeZeroValue = assertions.ShouldBeZeroValue
|
||||||
|
ShouldNotBeZeroValue = assertions.ShouldNotBeZeroValue
|
||||||
|
|
||||||
ShouldBeGreaterThan = assertions.ShouldBeGreaterThan
|
ShouldBeGreaterThan = assertions.ShouldBeGreaterThan
|
||||||
ShouldBeGreaterThanOrEqualTo = assertions.ShouldBeGreaterThanOrEqualTo
|
ShouldBeGreaterThanOrEqualTo = assertions.ShouldBeGreaterThanOrEqualTo
|
||||||
|
2
vendor/github.com/smartystreets/goconvey/convey/gotest/utils.go
generated
vendored
2
vendor/github.com/smartystreets/goconvey/convey/gotest/utils.go
generated
vendored
@ -19,7 +19,7 @@ func ResolveExternalCaller() (file string, line int, name string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file, line, name = "<unkown file>", -1, "<unknown name>"
|
file, line, name = "<unknown file>", -1, "<unknown name>"
|
||||||
return // panic?
|
return // panic?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vendor/github.com/smartystreets/goconvey/convey/init.go
generated
vendored
2
vendor/github.com/smartystreets/goconvey/convey/init.go
generated
vendored
@ -20,7 +20,7 @@ func init() {
|
|||||||
func declareFlags() {
|
func declareFlags() {
|
||||||
flag.BoolVar(&json, "convey-json", false, "When true, emits results in JSON blocks. Default: 'false'")
|
flag.BoolVar(&json, "convey-json", false, "When true, emits results in JSON blocks. Default: 'false'")
|
||||||
flag.BoolVar(&silent, "convey-silent", false, "When true, all output from GoConvey is suppressed.")
|
flag.BoolVar(&silent, "convey-silent", false, "When true, all output from GoConvey is suppressed.")
|
||||||
flag.BoolVar(&story, "convey-story", false, "When true, emits story output, otherwise emits dot output. When not provided, this flag mirros the value of the '-test.v' flag")
|
flag.BoolVar(&story, "convey-story", false, "When true, emits story output, otherwise emits dot output. When not provided, this flag mirrors the value of the '-test.v' flag")
|
||||||
|
|
||||||
if noStoryFlagProvided() {
|
if noStoryFlagProvided() {
|
||||||
story = verboseEnabled
|
story = verboseEnabled
|
||||||
|
2
vendor/github.com/smartystreets/goconvey/convey/reporting/init.go
generated
vendored
2
vendor/github.com/smartystreets/goconvey/convey/reporting/init.go
generated
vendored
@ -56,7 +56,7 @@ var (
|
|||||||
dotError = "E"
|
dotError = "E"
|
||||||
dotSkip = "S"
|
dotSkip = "S"
|
||||||
errorTemplate = "* %s \nLine %d: - %v \n%s\n"
|
errorTemplate = "* %s \nLine %d: - %v \n%s\n"
|
||||||
failureTemplate = "* %s \nLine %d:\n%s\n"
|
failureTemplate = "* %s \nLine %d:\n%s\n%s\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
5
vendor/github.com/smartystreets/goconvey/convey/reporting/printer.go
generated
vendored
5
vendor/github.com/smartystreets/goconvey/convey/reporting/printer.go
generated
vendored
@ -30,12 +30,15 @@ func (self *Printer) format(message string, values ...interface{}) string {
|
|||||||
if len(values) == 0 {
|
if len(values) == 0 {
|
||||||
formatted = self.prefix + message
|
formatted = self.prefix + message
|
||||||
} else {
|
} else {
|
||||||
formatted = self.prefix + fmt.Sprintf(message, values...)
|
formatted = self.prefix + fmt_Sprintf(message, values...)
|
||||||
}
|
}
|
||||||
indented := strings.Replace(formatted, newline, newline+self.prefix, -1)
|
indented := strings.Replace(formatted, newline, newline+self.prefix, -1)
|
||||||
return strings.TrimRight(indented, space)
|
return strings.TrimRight(indented, space)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extracting fmt.Sprintf to a separate variable circumvents go vet, which, as of go 1.10 is run with go test.
|
||||||
|
var fmt_Sprintf = fmt.Sprintf
|
||||||
|
|
||||||
func (self *Printer) Indent() {
|
func (self *Printer) Indent() {
|
||||||
self.prefix += pad
|
self.prefix += pad
|
||||||
}
|
}
|
||||||
|
2
vendor/github.com/smartystreets/goconvey/convey/reporting/problems.go
generated
vendored
2
vendor/github.com/smartystreets/goconvey/convey/reporting/problems.go
generated
vendored
@ -53,7 +53,7 @@ func (self *problem) showFailures() {
|
|||||||
self.out.Println("\nFailures:\n")
|
self.out.Println("\nFailures:\n")
|
||||||
self.out.Indent()
|
self.out.Indent()
|
||||||
}
|
}
|
||||||
self.out.Println(failureTemplate, f.File, f.Line, f.Failure)
|
self.out.Println(failureTemplate, f.File, f.Line, f.Failure, f.StackTrace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
54
vendor/golang.org/x/sys/unix/asm_linux_riscv64.s
generated
vendored
Normal file
54
vendor/golang.org/x/sys/unix/asm_linux_riscv64.s
generated
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build riscv64,!gccgo
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// System calls for linux/riscv64.
|
||||||
|
//
|
||||||
|
// Where available, just jump to package syscall's implementation of
|
||||||
|
// these functions.
|
||||||
|
|
||||||
|
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
||||||
|
JMP syscall·Syscall(SB)
|
||||||
|
|
||||||
|
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
||||||
|
JMP syscall·Syscall6(SB)
|
||||||
|
|
||||||
|
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
||||||
|
CALL runtime·entersyscall(SB)
|
||||||
|
MOV a1+8(FP), A0
|
||||||
|
MOV a2+16(FP), A1
|
||||||
|
MOV a3+24(FP), A2
|
||||||
|
MOV $0, A3
|
||||||
|
MOV $0, A4
|
||||||
|
MOV $0, A5
|
||||||
|
MOV $0, A6
|
||||||
|
MOV trap+0(FP), A7 // syscall entry
|
||||||
|
ECALL
|
||||||
|
MOV A0, r1+32(FP) // r1
|
||||||
|
MOV A1, r2+40(FP) // r2
|
||||||
|
CALL runtime·exitsyscall(SB)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
||||||
|
JMP syscall·RawSyscall(SB)
|
||||||
|
|
||||||
|
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
||||||
|
JMP syscall·RawSyscall6(SB)
|
||||||
|
|
||||||
|
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
||||||
|
MOV a1+8(FP), A0
|
||||||
|
MOV a2+16(FP), A1
|
||||||
|
MOV a3+24(FP), A2
|
||||||
|
MOV ZERO, A3
|
||||||
|
MOV ZERO, A4
|
||||||
|
MOV ZERO, A5
|
||||||
|
MOV trap+0(FP), A7 // syscall entry
|
||||||
|
ECALL
|
||||||
|
MOV A0, r1+32(FP)
|
||||||
|
MOV A1, r2+40(FP)
|
||||||
|
RET
|
29
vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s
generated
vendored
Normal file
29
vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !gccgo
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// System call support for arm64, OpenBSD
|
||||||
|
//
|
||||||
|
|
||||||
|
// Just jump to package syscall's implementation for all these functions.
|
||||||
|
// The runtime may know about them.
|
||||||
|
|
||||||
|
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
||||||
|
JMP syscall·Syscall(SB)
|
||||||
|
|
||||||
|
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
||||||
|
JMP syscall·Syscall6(SB)
|
||||||
|
|
||||||
|
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
||||||
|
JMP syscall·Syscall9(SB)
|
||||||
|
|
||||||
|
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
||||||
|
JMP syscall·RawSyscall(SB)
|
||||||
|
|
||||||
|
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
||||||
|
JMP syscall·RawSyscall6(SB)
|
89
vendor/golang.org/x/sys/unix/dirent.go
generated
vendored
89
vendor/golang.org/x/sys/unix/dirent.go
generated
vendored
@ -6,12 +6,97 @@
|
|||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import "syscall"
|
import "unsafe"
|
||||||
|
|
||||||
|
// readInt returns the size-bytes unsigned integer in native byte order at offset off.
|
||||||
|
func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
|
||||||
|
if len(b) < int(off+size) {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
if isBigEndian {
|
||||||
|
return readIntBE(b[off:], size), true
|
||||||
|
}
|
||||||
|
return readIntLE(b[off:], size), true
|
||||||
|
}
|
||||||
|
|
||||||
|
func readIntBE(b []byte, size uintptr) uint64 {
|
||||||
|
switch size {
|
||||||
|
case 1:
|
||||||
|
return uint64(b[0])
|
||||||
|
case 2:
|
||||||
|
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[1]) | uint64(b[0])<<8
|
||||||
|
case 4:
|
||||||
|
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24
|
||||||
|
case 8:
|
||||||
|
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
|
||||||
|
uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
|
||||||
|
default:
|
||||||
|
panic("syscall: readInt with unsupported size")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readIntLE(b []byte, size uintptr) uint64 {
|
||||||
|
switch size {
|
||||||
|
case 1:
|
||||||
|
return uint64(b[0])
|
||||||
|
case 2:
|
||||||
|
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[0]) | uint64(b[1])<<8
|
||||||
|
case 4:
|
||||||
|
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24
|
||||||
|
case 8:
|
||||||
|
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
||||||
|
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
|
||||||
|
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
|
||||||
|
default:
|
||||||
|
panic("syscall: readInt with unsupported size")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ParseDirent parses up to max directory entries in buf,
|
// ParseDirent parses up to max directory entries in buf,
|
||||||
// appending the names to names. It returns the number of
|
// appending the names to names. It returns the number of
|
||||||
// bytes consumed from buf, the number of entries added
|
// bytes consumed from buf, the number of entries added
|
||||||
// to names, and the new names slice.
|
// to names, and the new names slice.
|
||||||
func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
|
func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
|
||||||
return syscall.ParseDirent(buf, max, names)
|
origlen := len(buf)
|
||||||
|
count = 0
|
||||||
|
for max != 0 && len(buf) > 0 {
|
||||||
|
reclen, ok := direntReclen(buf)
|
||||||
|
if !ok || reclen > uint64(len(buf)) {
|
||||||
|
return origlen, count, names
|
||||||
|
}
|
||||||
|
rec := buf[:reclen]
|
||||||
|
buf = buf[reclen:]
|
||||||
|
ino, ok := direntIno(rec)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if ino == 0 { // File absent in directory.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))
|
||||||
|
namlen, ok := direntNamlen(rec)
|
||||||
|
if !ok || namoff+namlen > uint64(len(rec)) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
name := rec[namoff : namoff+namlen]
|
||||||
|
for i, c := range name {
|
||||||
|
if c == 0 {
|
||||||
|
name = name[:i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check for useless names before allocating a string.
|
||||||
|
if string(name) == "." || string(name) == ".." {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
max--
|
||||||
|
count++
|
||||||
|
names = append(names, string(name))
|
||||||
|
}
|
||||||
|
return origlen - len(buf), count, names
|
||||||
}
|
}
|
||||||
|
29
vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
29
vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
@ -105,25 +105,25 @@ dragonfly_amd64)
|
|||||||
freebsd_386)
|
freebsd_386)
|
||||||
mkerrors="$mkerrors -m32"
|
mkerrors="$mkerrors -m32"
|
||||||
mksyscall="go run mksyscall.go -l32"
|
mksyscall="go run mksyscall.go -l32"
|
||||||
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
;;
|
;;
|
||||||
freebsd_amd64)
|
freebsd_amd64)
|
||||||
mkerrors="$mkerrors -m64"
|
mkerrors="$mkerrors -m64"
|
||||||
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
;;
|
;;
|
||||||
freebsd_arm)
|
freebsd_arm)
|
||||||
mkerrors="$mkerrors"
|
mkerrors="$mkerrors"
|
||||||
mksyscall="go run mksyscall.go -l32 -arm"
|
mksyscall="go run mksyscall.go -l32 -arm"
|
||||||
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
|
||||||
# Let the type of C char be signed for making the bare syscall
|
# Let the type of C char be signed for making the bare syscall
|
||||||
# API consistent across platforms.
|
# API consistent across platforms.
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
|
||||||
;;
|
;;
|
||||||
freebsd_arm64)
|
freebsd_arm64)
|
||||||
mkerrors="$mkerrors -m64"
|
mkerrors="$mkerrors -m64"
|
||||||
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'"
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
;;
|
;;
|
||||||
netbsd_386)
|
netbsd_386)
|
||||||
@ -146,24 +146,39 @@ netbsd_arm)
|
|||||||
# API consistent across platforms.
|
# API consistent across platforms.
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
|
||||||
;;
|
;;
|
||||||
|
netbsd_arm64)
|
||||||
|
mkerrors="$mkerrors -m64"
|
||||||
|
mksyscall="go run mksyscall.go -netbsd"
|
||||||
|
mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'"
|
||||||
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
|
;;
|
||||||
openbsd_386)
|
openbsd_386)
|
||||||
mkerrors="$mkerrors -m32"
|
mkerrors="$mkerrors -m32"
|
||||||
mksyscall="go run mksyscall.go -l32 -openbsd"
|
mksyscall="go run mksyscall.go -l32 -openbsd"
|
||||||
mksysctl="./mksysctl_openbsd.pl"
|
mksysctl="go run mksysctl_openbsd.go"
|
||||||
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
;;
|
;;
|
||||||
openbsd_amd64)
|
openbsd_amd64)
|
||||||
mkerrors="$mkerrors -m64"
|
mkerrors="$mkerrors -m64"
|
||||||
mksyscall="go run mksyscall.go -openbsd"
|
mksyscall="go run mksyscall.go -openbsd"
|
||||||
mksysctl="./mksysctl_openbsd.pl"
|
mksysctl="go run mksysctl_openbsd.go"
|
||||||
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
||||||
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
|
||||||
;;
|
;;
|
||||||
openbsd_arm)
|
openbsd_arm)
|
||||||
mkerrors="$mkerrors"
|
mkerrors="$mkerrors"
|
||||||
mksyscall="go run mksyscall.go -l32 -openbsd -arm"
|
mksyscall="go run mksyscall.go -l32 -openbsd -arm"
|
||||||
mksysctl="./mksysctl_openbsd.pl"
|
mksysctl="go run mksysctl_openbsd.go"
|
||||||
|
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
||||||
|
# Let the type of C char be signed for making the bare syscall
|
||||||
|
# API consistent across platforms.
|
||||||
|
mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
|
||||||
|
;;
|
||||||
|
openbsd_arm64)
|
||||||
|
mkerrors="$mkerrors -m64"
|
||||||
|
mksyscall="go run mksyscall.go -openbsd"
|
||||||
|
mksysctl="go run mksysctl_openbsd.go"
|
||||||
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'"
|
||||||
# Let the type of C char be signed for making the bare syscall
|
# Let the type of C char be signed for making the bare syscall
|
||||||
# API consistent across platforms.
|
# API consistent across platforms.
|
||||||
|
8
vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
8
vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
@ -182,6 +182,8 @@ struct ltchars {
|
|||||||
#include <sys/signalfd.h>
|
#include <sys/signalfd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/xattr.h>
|
#include <sys/xattr.h>
|
||||||
|
#include <linux/bpf.h>
|
||||||
|
#include <linux/capability.h>
|
||||||
#include <linux/errqueue.h>
|
#include <linux/errqueue.h>
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/if_alg.h>
|
#include <linux/if_alg.h>
|
||||||
@ -222,6 +224,7 @@ struct ltchars {
|
|||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
#include <linux/rtc.h>
|
#include <linux/rtc.h>
|
||||||
#include <linux/if_xdp.h>
|
#include <linux/if_xdp.h>
|
||||||
|
#include <linux/cryptouser.h>
|
||||||
#include <mtd/ubi-user.h>
|
#include <mtd/ubi-user.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
|
|
||||||
@ -432,7 +435,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^TC[IO](ON|OFF)$/ ||
|
$2 ~ /^TC[IO](ON|OFF)$/ ||
|
||||||
$2 ~ /^IN_/ ||
|
$2 ~ /^IN_/ ||
|
||||||
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
||||||
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ ||
|
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ ||
|
||||||
$2 ~ /^TP_STATUS_/ ||
|
$2 ~ /^TP_STATUS_/ ||
|
||||||
$2 ~ /^FALLOC_/ ||
|
$2 ~ /^FALLOC_/ ||
|
||||||
$2 == "ICMPV6_FILTER" ||
|
$2 == "ICMPV6_FILTER" ||
|
||||||
@ -465,7 +468,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ ||
|
$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ ||
|
||||||
$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ ||
|
$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ ||
|
||||||
$2 ~ /^CLONE_[A-Z_]+/ ||
|
$2 ~ /^CLONE_[A-Z_]+/ ||
|
||||||
$2 !~ /^(BPF_TIMEVAL)$/ &&
|
$2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ &&
|
||||||
$2 ~ /^(BPF|DLT)_/ ||
|
$2 ~ /^(BPF|DLT)_/ ||
|
||||||
$2 ~ /^(CLOCK|TIMER)_/ ||
|
$2 ~ /^(CLOCK|TIMER)_/ ||
|
||||||
$2 ~ /^CAN_/ ||
|
$2 ~ /^CAN_/ ||
|
||||||
@ -499,6 +502,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^NFN/ ||
|
$2 ~ /^NFN/ ||
|
||||||
$2 ~ /^XDP_/ ||
|
$2 ~ /^XDP_/ ||
|
||||||
$2 ~ /^(HDIO|WIN|SMART)_/ ||
|
$2 ~ /^(HDIO|WIN|SMART)_/ ||
|
||||||
|
$2 ~ /^CRYPTO_/ ||
|
||||||
$2 !~ "WMESGLEN" &&
|
$2 !~ "WMESGLEN" &&
|
||||||
$2 ~ /^W[A-Z0-9]+$/ ||
|
$2 ~ /^W[A-Z0-9]+$/ ||
|
||||||
$2 ~/^PPPIOC/ ||
|
$2 ~/^PPPIOC/ ||
|
||||||
|
20
vendor/golang.org/x/sys/unix/mkpost.go
generated
vendored
20
vendor/golang.org/x/sys/unix/mkpost.go
generated
vendored
@ -42,9 +42,16 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if goos == "aix" {
|
||||||
|
// Replace type of Atim, Mtim and Ctim by Timespec in Stat_t
|
||||||
|
// to avoid having both StTimespec and Timespec.
|
||||||
|
sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`)
|
||||||
|
b = sttimespec.ReplaceAll(b, []byte("Timespec"))
|
||||||
|
}
|
||||||
|
|
||||||
// Intentionally export __val fields in Fsid and Sigset_t
|
// Intentionally export __val fields in Fsid and Sigset_t
|
||||||
valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`)
|
valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__(bits|val)(\s+\S+\s+)}`)
|
||||||
b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}"))
|
b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$4}"))
|
||||||
|
|
||||||
// Intentionally export __fds_bits field in FdSet
|
// Intentionally export __fds_bits field in FdSet
|
||||||
fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`)
|
fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`)
|
||||||
@ -96,6 +103,15 @@ func main() {
|
|||||||
cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`)
|
cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`)
|
||||||
b = cgoCommandRegex.ReplaceAll(b, []byte(replacement))
|
b = cgoCommandRegex.ReplaceAll(b, []byte(replacement))
|
||||||
|
|
||||||
|
// Rename Stat_t time fields
|
||||||
|
if goos == "freebsd" && goarch == "386" {
|
||||||
|
// Hide Stat_t.[AMCB]tim_ext fields
|
||||||
|
renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`)
|
||||||
|
b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_"))
|
||||||
|
}
|
||||||
|
renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`)
|
||||||
|
b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}"))
|
||||||
|
|
||||||
// gofmt
|
// gofmt
|
||||||
b, err = format.Source(b)
|
b, err = format.Source(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
355
vendor/golang.org/x/sys/unix/mksysctl_openbsd.go
generated
vendored
Normal file
355
vendor/golang.org/x/sys/unix/mksysctl_openbsd.go
generated
vendored
Normal file
@ -0,0 +1,355 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
// Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
|
||||||
|
//
|
||||||
|
// Build a MIB with each entry being an array containing the level, type and
|
||||||
|
// a hash that will contain additional entries if the current entry is a node.
|
||||||
|
// We then walk this MIB and create a flattened sysctl name to OID hash.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
goos, goarch string
|
||||||
|
)
|
||||||
|
|
||||||
|
// cmdLine returns this programs's commandline arguments.
|
||||||
|
func cmdLine() string {
|
||||||
|
return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
// buildTags returns build tags.
|
||||||
|
func buildTags() string {
|
||||||
|
return fmt.Sprintf("%s,%s", goarch, goos)
|
||||||
|
}
|
||||||
|
|
||||||
|
// reMatch performs regular expression match and stores the substring slice to value pointed by m.
|
||||||
|
func reMatch(re *regexp.Regexp, str string, m *[]string) bool {
|
||||||
|
*m = re.FindStringSubmatch(str)
|
||||||
|
if *m != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
type nodeElement struct {
|
||||||
|
n int
|
||||||
|
t string
|
||||||
|
pE *map[string]nodeElement
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
debugEnabled bool
|
||||||
|
mib map[string]nodeElement
|
||||||
|
node *map[string]nodeElement
|
||||||
|
nodeMap map[string]string
|
||||||
|
sysCtl []string
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`)
|
||||||
|
ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`)
|
||||||
|
ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`)
|
||||||
|
netInetRE = regexp.MustCompile(`^netinet/`)
|
||||||
|
netInet6RE = regexp.MustCompile(`^netinet6/`)
|
||||||
|
netRE = regexp.MustCompile(`^net/`)
|
||||||
|
bracesRE = regexp.MustCompile(`{.*}`)
|
||||||
|
ctlTypeRE = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`)
|
||||||
|
fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`)
|
||||||
|
)
|
||||||
|
|
||||||
|
func debug(s string) {
|
||||||
|
if debugEnabled {
|
||||||
|
fmt.Fprintln(os.Stderr, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk the MIB and build a sysctl name to OID mapping.
|
||||||
|
func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) {
|
||||||
|
lNode := pNode // local copy of pointer to node
|
||||||
|
var keys []string
|
||||||
|
for k := range *lNode {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
|
for _, key := range keys {
|
||||||
|
nodename := name
|
||||||
|
if name != "" {
|
||||||
|
nodename += "."
|
||||||
|
}
|
||||||
|
nodename += key
|
||||||
|
|
||||||
|
nodeoid := append(oid, (*pNode)[key].n)
|
||||||
|
|
||||||
|
if (*pNode)[key].t == `CTLTYPE_NODE` {
|
||||||
|
if _, ok := nodeMap[nodename]; ok {
|
||||||
|
lNode = &mib
|
||||||
|
ctlName := nodeMap[nodename]
|
||||||
|
for _, part := range strings.Split(ctlName, ".") {
|
||||||
|
lNode = ((*lNode)[part]).pE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lNode = (*pNode)[key].pE
|
||||||
|
}
|
||||||
|
buildSysctl(lNode, nodename, nodeoid)
|
||||||
|
} else if (*pNode)[key].t != "" {
|
||||||
|
oidStr := []string{}
|
||||||
|
for j := range nodeoid {
|
||||||
|
oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j]))
|
||||||
|
}
|
||||||
|
text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n"
|
||||||
|
sysCtl = append(sysCtl, text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Get the OS (using GOOS_TARGET if it exist)
|
||||||
|
goos = os.Getenv("GOOS_TARGET")
|
||||||
|
if goos == "" {
|
||||||
|
goos = os.Getenv("GOOS")
|
||||||
|
}
|
||||||
|
// Get the architecture (using GOARCH_TARGET if it exists)
|
||||||
|
goarch = os.Getenv("GOARCH_TARGET")
|
||||||
|
if goarch == "" {
|
||||||
|
goarch = os.Getenv("GOARCH")
|
||||||
|
}
|
||||||
|
// Check if GOOS and GOARCH environment variables are defined
|
||||||
|
if goarch == "" || goos == "" {
|
||||||
|
fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
mib = make(map[string]nodeElement)
|
||||||
|
headers := [...]string{
|
||||||
|
`sys/sysctl.h`,
|
||||||
|
`sys/socket.h`,
|
||||||
|
`sys/tty.h`,
|
||||||
|
`sys/malloc.h`,
|
||||||
|
`sys/mount.h`,
|
||||||
|
`sys/namei.h`,
|
||||||
|
`sys/sem.h`,
|
||||||
|
`sys/shm.h`,
|
||||||
|
`sys/vmmeter.h`,
|
||||||
|
`uvm/uvmexp.h`,
|
||||||
|
`uvm/uvm_param.h`,
|
||||||
|
`uvm/uvm_swap_encrypt.h`,
|
||||||
|
`ddb/db_var.h`,
|
||||||
|
`net/if.h`,
|
||||||
|
`net/if_pfsync.h`,
|
||||||
|
`net/pipex.h`,
|
||||||
|
`netinet/in.h`,
|
||||||
|
`netinet/icmp_var.h`,
|
||||||
|
`netinet/igmp_var.h`,
|
||||||
|
`netinet/ip_ah.h`,
|
||||||
|
`netinet/ip_carp.h`,
|
||||||
|
`netinet/ip_divert.h`,
|
||||||
|
`netinet/ip_esp.h`,
|
||||||
|
`netinet/ip_ether.h`,
|
||||||
|
`netinet/ip_gre.h`,
|
||||||
|
`netinet/ip_ipcomp.h`,
|
||||||
|
`netinet/ip_ipip.h`,
|
||||||
|
`netinet/pim_var.h`,
|
||||||
|
`netinet/tcp_var.h`,
|
||||||
|
`netinet/udp_var.h`,
|
||||||
|
`netinet6/in6.h`,
|
||||||
|
`netinet6/ip6_divert.h`,
|
||||||
|
`netinet6/pim6_var.h`,
|
||||||
|
`netinet/icmp6.h`,
|
||||||
|
`netmpls/mpls.h`,
|
||||||
|
}
|
||||||
|
|
||||||
|
ctls := [...]string{
|
||||||
|
`kern`,
|
||||||
|
`vm`,
|
||||||
|
`fs`,
|
||||||
|
`net`,
|
||||||
|
//debug /* Special handling required */
|
||||||
|
`hw`,
|
||||||
|
//machdep /* Arch specific */
|
||||||
|
`user`,
|
||||||
|
`ddb`,
|
||||||
|
//vfs /* Special handling required */
|
||||||
|
`fs.posix`,
|
||||||
|
`kern.forkstat`,
|
||||||
|
`kern.intrcnt`,
|
||||||
|
`kern.malloc`,
|
||||||
|
`kern.nchstats`,
|
||||||
|
`kern.seminfo`,
|
||||||
|
`kern.shminfo`,
|
||||||
|
`kern.timecounter`,
|
||||||
|
`kern.tty`,
|
||||||
|
`kern.watchdog`,
|
||||||
|
`net.bpf`,
|
||||||
|
`net.ifq`,
|
||||||
|
`net.inet`,
|
||||||
|
`net.inet.ah`,
|
||||||
|
`net.inet.carp`,
|
||||||
|
`net.inet.divert`,
|
||||||
|
`net.inet.esp`,
|
||||||
|
`net.inet.etherip`,
|
||||||
|
`net.inet.gre`,
|
||||||
|
`net.inet.icmp`,
|
||||||
|
`net.inet.igmp`,
|
||||||
|
`net.inet.ip`,
|
||||||
|
`net.inet.ip.ifq`,
|
||||||
|
`net.inet.ipcomp`,
|
||||||
|
`net.inet.ipip`,
|
||||||
|
`net.inet.mobileip`,
|
||||||
|
`net.inet.pfsync`,
|
||||||
|
`net.inet.pim`,
|
||||||
|
`net.inet.tcp`,
|
||||||
|
`net.inet.udp`,
|
||||||
|
`net.inet6`,
|
||||||
|
`net.inet6.divert`,
|
||||||
|
`net.inet6.ip6`,
|
||||||
|
`net.inet6.icmp6`,
|
||||||
|
`net.inet6.pim6`,
|
||||||
|
`net.inet6.tcp6`,
|
||||||
|
`net.inet6.udp6`,
|
||||||
|
`net.mpls`,
|
||||||
|
`net.mpls.ifq`,
|
||||||
|
`net.key`,
|
||||||
|
`net.pflow`,
|
||||||
|
`net.pfsync`,
|
||||||
|
`net.pipex`,
|
||||||
|
`net.rt`,
|
||||||
|
`vm.swapencrypt`,
|
||||||
|
//vfsgenctl /* Special handling required */
|
||||||
|
}
|
||||||
|
|
||||||
|
// Node name "fixups"
|
||||||
|
ctlMap := map[string]string{
|
||||||
|
"ipproto": "net.inet",
|
||||||
|
"net.inet.ipproto": "net.inet",
|
||||||
|
"net.inet6.ipv6proto": "net.inet6",
|
||||||
|
"net.inet6.ipv6": "net.inet6.ip6",
|
||||||
|
"net.inet.icmpv6": "net.inet6.icmp6",
|
||||||
|
"net.inet6.divert6": "net.inet6.divert",
|
||||||
|
"net.inet6.tcp6": "net.inet.tcp",
|
||||||
|
"net.inet6.udp6": "net.inet.udp",
|
||||||
|
"mpls": "net.mpls",
|
||||||
|
"swpenc": "vm.swapencrypt",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Node mappings
|
||||||
|
nodeMap = map[string]string{
|
||||||
|
"net.inet.ip.ifq": "net.ifq",
|
||||||
|
"net.inet.pfsync": "net.pfsync",
|
||||||
|
"net.mpls.ifq": "net.ifq",
|
||||||
|
}
|
||||||
|
|
||||||
|
mCtls := make(map[string]bool)
|
||||||
|
for _, ctl := range ctls {
|
||||||
|
mCtls[ctl] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, header := range headers {
|
||||||
|
debug("Processing " + header)
|
||||||
|
file, err := os.Open(filepath.Join("/usr/include", header))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
s := bufio.NewScanner(file)
|
||||||
|
for s.Scan() {
|
||||||
|
var sub []string
|
||||||
|
if reMatch(ctlNames1RE, s.Text(), &sub) ||
|
||||||
|
reMatch(ctlNames2RE, s.Text(), &sub) ||
|
||||||
|
reMatch(ctlNames3RE, s.Text(), &sub) {
|
||||||
|
if sub[1] == `CTL_NAMES` {
|
||||||
|
// Top level.
|
||||||
|
node = &mib
|
||||||
|
} else {
|
||||||
|
// Node.
|
||||||
|
nodename := strings.ToLower(sub[2])
|
||||||
|
ctlName := ""
|
||||||
|
if reMatch(netInetRE, header, &sub) {
|
||||||
|
ctlName = "net.inet." + nodename
|
||||||
|
} else if reMatch(netInet6RE, header, &sub) {
|
||||||
|
ctlName = "net.inet6." + nodename
|
||||||
|
} else if reMatch(netRE, header, &sub) {
|
||||||
|
ctlName = "net." + nodename
|
||||||
|
} else {
|
||||||
|
ctlName = nodename
|
||||||
|
ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if val, ok := ctlMap[ctlName]; ok {
|
||||||
|
ctlName = val
|
||||||
|
}
|
||||||
|
if _, ok := mCtls[ctlName]; !ok {
|
||||||
|
debug("Ignoring " + ctlName + "...")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk down from the top of the MIB.
|
||||||
|
node = &mib
|
||||||
|
for _, part := range strings.Split(ctlName, ".") {
|
||||||
|
if _, ok := (*node)[part]; !ok {
|
||||||
|
debug("Missing node " + part)
|
||||||
|
(*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}}
|
||||||
|
}
|
||||||
|
node = (*node)[part].pE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate current node with entries.
|
||||||
|
i := -1
|
||||||
|
for !strings.HasPrefix(s.Text(), "}") {
|
||||||
|
s.Scan()
|
||||||
|
if reMatch(bracesRE, s.Text(), &sub) {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
if !reMatch(ctlTypeRE, s.Text(), &sub) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
(*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = s.Err()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
file.Close()
|
||||||
|
}
|
||||||
|
buildSysctl(&mib, "", []int{})
|
||||||
|
|
||||||
|
sort.Strings(sysCtl)
|
||||||
|
text := strings.Join(sysCtl, "")
|
||||||
|
|
||||||
|
fmt.Printf(srcTemplate, cmdLine(), buildTags(), text)
|
||||||
|
}
|
||||||
|
|
||||||
|
const srcTemplate = `// %s
|
||||||
|
// Code generated by the command above; DO NOT EDIT.
|
||||||
|
|
||||||
|
// +build %s
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
type mibentry struct {
|
||||||
|
ctlname string
|
||||||
|
ctloid []_C_int
|
||||||
|
}
|
||||||
|
|
||||||
|
var sysctlMib = []mibentry {
|
||||||
|
%s
|
||||||
|
}
|
||||||
|
`
|
265
vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl
generated
vendored
265
vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl
generated
vendored
@ -1,265 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
# Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
|
|
||||||
#
|
|
||||||
# Build a MIB with each entry being an array containing the level, type and
|
|
||||||
# a hash that will contain additional entries if the current entry is a node.
|
|
||||||
# We then walk this MIB and create a flattened sysctl name to OID hash.
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
|
|
||||||
print STDERR "GOARCH or GOOS not defined in environment\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $debug = 0;
|
|
||||||
my %ctls = ();
|
|
||||||
|
|
||||||
my @headers = qw (
|
|
||||||
sys/sysctl.h
|
|
||||||
sys/socket.h
|
|
||||||
sys/tty.h
|
|
||||||
sys/malloc.h
|
|
||||||
sys/mount.h
|
|
||||||
sys/namei.h
|
|
||||||
sys/sem.h
|
|
||||||
sys/shm.h
|
|
||||||
sys/vmmeter.h
|
|
||||||
uvm/uvmexp.h
|
|
||||||
uvm/uvm_param.h
|
|
||||||
uvm/uvm_swap_encrypt.h
|
|
||||||
ddb/db_var.h
|
|
||||||
net/if.h
|
|
||||||
net/if_pfsync.h
|
|
||||||
net/pipex.h
|
|
||||||
netinet/in.h
|
|
||||||
netinet/icmp_var.h
|
|
||||||
netinet/igmp_var.h
|
|
||||||
netinet/ip_ah.h
|
|
||||||
netinet/ip_carp.h
|
|
||||||
netinet/ip_divert.h
|
|
||||||
netinet/ip_esp.h
|
|
||||||
netinet/ip_ether.h
|
|
||||||
netinet/ip_gre.h
|
|
||||||
netinet/ip_ipcomp.h
|
|
||||||
netinet/ip_ipip.h
|
|
||||||
netinet/pim_var.h
|
|
||||||
netinet/tcp_var.h
|
|
||||||
netinet/udp_var.h
|
|
||||||
netinet6/in6.h
|
|
||||||
netinet6/ip6_divert.h
|
|
||||||
netinet6/pim6_var.h
|
|
||||||
netinet/icmp6.h
|
|
||||||
netmpls/mpls.h
|
|
||||||
);
|
|
||||||
|
|
||||||
my @ctls = qw (
|
|
||||||
kern
|
|
||||||
vm
|
|
||||||
fs
|
|
||||||
net
|
|
||||||
#debug # Special handling required
|
|
||||||
hw
|
|
||||||
#machdep # Arch specific
|
|
||||||
user
|
|
||||||
ddb
|
|
||||||
#vfs # Special handling required
|
|
||||||
fs.posix
|
|
||||||
kern.forkstat
|
|
||||||
kern.intrcnt
|
|
||||||
kern.malloc
|
|
||||||
kern.nchstats
|
|
||||||
kern.seminfo
|
|
||||||
kern.shminfo
|
|
||||||
kern.timecounter
|
|
||||||
kern.tty
|
|
||||||
kern.watchdog
|
|
||||||
net.bpf
|
|
||||||
net.ifq
|
|
||||||
net.inet
|
|
||||||
net.inet.ah
|
|
||||||
net.inet.carp
|
|
||||||
net.inet.divert
|
|
||||||
net.inet.esp
|
|
||||||
net.inet.etherip
|
|
||||||
net.inet.gre
|
|
||||||
net.inet.icmp
|
|
||||||
net.inet.igmp
|
|
||||||
net.inet.ip
|
|
||||||
net.inet.ip.ifq
|
|
||||||
net.inet.ipcomp
|
|
||||||
net.inet.ipip
|
|
||||||
net.inet.mobileip
|
|
||||||
net.inet.pfsync
|
|
||||||
net.inet.pim
|
|
||||||
net.inet.tcp
|
|
||||||
net.inet.udp
|
|
||||||
net.inet6
|
|
||||||
net.inet6.divert
|
|
||||||
net.inet6.ip6
|
|
||||||
net.inet6.icmp6
|
|
||||||
net.inet6.pim6
|
|
||||||
net.inet6.tcp6
|
|
||||||
net.inet6.udp6
|
|
||||||
net.mpls
|
|
||||||
net.mpls.ifq
|
|
||||||
net.key
|
|
||||||
net.pflow
|
|
||||||
net.pfsync
|
|
||||||
net.pipex
|
|
||||||
net.rt
|
|
||||||
vm.swapencrypt
|
|
||||||
#vfsgenctl # Special handling required
|
|
||||||
);
|
|
||||||
|
|
||||||
# Node name "fixups"
|
|
||||||
my %ctl_map = (
|
|
||||||
"ipproto" => "net.inet",
|
|
||||||
"net.inet.ipproto" => "net.inet",
|
|
||||||
"net.inet6.ipv6proto" => "net.inet6",
|
|
||||||
"net.inet6.ipv6" => "net.inet6.ip6",
|
|
||||||
"net.inet.icmpv6" => "net.inet6.icmp6",
|
|
||||||
"net.inet6.divert6" => "net.inet6.divert",
|
|
||||||
"net.inet6.tcp6" => "net.inet.tcp",
|
|
||||||
"net.inet6.udp6" => "net.inet.udp",
|
|
||||||
"mpls" => "net.mpls",
|
|
||||||
"swpenc" => "vm.swapencrypt"
|
|
||||||
);
|
|
||||||
|
|
||||||
# Node mappings
|
|
||||||
my %node_map = (
|
|
||||||
"net.inet.ip.ifq" => "net.ifq",
|
|
||||||
"net.inet.pfsync" => "net.pfsync",
|
|
||||||
"net.mpls.ifq" => "net.ifq"
|
|
||||||
);
|
|
||||||
|
|
||||||
my $ctlname;
|
|
||||||
my %mib = ();
|
|
||||||
my %sysctl = ();
|
|
||||||
my $node;
|
|
||||||
|
|
||||||
sub debug() {
|
|
||||||
print STDERR "$_[0]\n" if $debug;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Walk the MIB and build a sysctl name to OID mapping.
|
|
||||||
sub build_sysctl() {
|
|
||||||
my ($node, $name, $oid) = @_;
|
|
||||||
my %node = %{$node};
|
|
||||||
my @oid = @{$oid};
|
|
||||||
|
|
||||||
foreach my $key (sort keys %node) {
|
|
||||||
my @node = @{$node{$key}};
|
|
||||||
my $nodename = $name.($name ne '' ? '.' : '').$key;
|
|
||||||
my @nodeoid = (@oid, $node[0]);
|
|
||||||
if ($node[1] eq 'CTLTYPE_NODE') {
|
|
||||||
if (exists $node_map{$nodename}) {
|
|
||||||
$node = \%mib;
|
|
||||||
$ctlname = $node_map{$nodename};
|
|
||||||
foreach my $part (split /\./, $ctlname) {
|
|
||||||
$node = \%{@{$$node{$part}}[2]};
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$node = $node[2];
|
|
||||||
}
|
|
||||||
&build_sysctl($node, $nodename, \@nodeoid);
|
|
||||||
} elsif ($node[1] ne '') {
|
|
||||||
$sysctl{$nodename} = \@nodeoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach my $ctl (@ctls) {
|
|
||||||
$ctls{$ctl} = $ctl;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build MIB
|
|
||||||
foreach my $header (@headers) {
|
|
||||||
&debug("Processing $header...");
|
|
||||||
open HEADER, "/usr/include/$header" ||
|
|
||||||
print STDERR "Failed to open $header\n";
|
|
||||||
while (<HEADER>) {
|
|
||||||
if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ ||
|
|
||||||
$_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ ||
|
|
||||||
$_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) {
|
|
||||||
if ($1 eq 'CTL_NAMES') {
|
|
||||||
# Top level.
|
|
||||||
$node = \%mib;
|
|
||||||
} else {
|
|
||||||
# Node.
|
|
||||||
my $nodename = lc($2);
|
|
||||||
if ($header =~ /^netinet\//) {
|
|
||||||
$ctlname = "net.inet.$nodename";
|
|
||||||
} elsif ($header =~ /^netinet6\//) {
|
|
||||||
$ctlname = "net.inet6.$nodename";
|
|
||||||
} elsif ($header =~ /^net\//) {
|
|
||||||
$ctlname = "net.$nodename";
|
|
||||||
} else {
|
|
||||||
$ctlname = "$nodename";
|
|
||||||
$ctlname =~ s/^(fs|net|kern)_/$1\./;
|
|
||||||
}
|
|
||||||
if (exists $ctl_map{$ctlname}) {
|
|
||||||
$ctlname = $ctl_map{$ctlname};
|
|
||||||
}
|
|
||||||
if (not exists $ctls{$ctlname}) {
|
|
||||||
&debug("Ignoring $ctlname...");
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Walk down from the top of the MIB.
|
|
||||||
$node = \%mib;
|
|
||||||
foreach my $part (split /\./, $ctlname) {
|
|
||||||
if (not exists $$node{$part}) {
|
|
||||||
&debug("Missing node $part");
|
|
||||||
$$node{$part} = [ 0, '', {} ];
|
|
||||||
}
|
|
||||||
$node = \%{@{$$node{$part}}[2]};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Populate current node with entries.
|
|
||||||
my $i = -1;
|
|
||||||
while (defined($_) && $_ !~ /^}/) {
|
|
||||||
$_ = <HEADER>;
|
|
||||||
$i++ if $_ =~ /{.*}/;
|
|
||||||
next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/;
|
|
||||||
$$node{$1} = [ $i, $2, {} ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close HEADER;
|
|
||||||
}
|
|
||||||
|
|
||||||
&build_sysctl(\%mib, "", []);
|
|
||||||
|
|
||||||
print <<EOF;
|
|
||||||
// mksysctl_openbsd.pl
|
|
||||||
// Code generated by the command above; DO NOT EDIT.
|
|
||||||
|
|
||||||
// +build $ENV{'GOARCH'},$ENV{'GOOS'}
|
|
||||||
|
|
||||||
package unix;
|
|
||||||
|
|
||||||
type mibentry struct {
|
|
||||||
ctlname string
|
|
||||||
ctloid []_C_int
|
|
||||||
}
|
|
||||||
|
|
||||||
var sysctlMib = []mibentry {
|
|
||||||
EOF
|
|
||||||
|
|
||||||
foreach my $name (sort keys %sysctl) {
|
|
||||||
my @oid = @{$sysctl{$name}};
|
|
||||||
print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print <<EOF;
|
|
||||||
}
|
|
||||||
EOF
|
|
2
vendor/golang.org/x/sys/unix/mksysnum.go
generated
vendored
2
vendor/golang.org/x/sys/unix/mksysnum.go
generated
vendored
@ -139,7 +139,7 @@ func main() {
|
|||||||
text += format(name, num, proto)
|
text += format(name, num, proto)
|
||||||
}
|
}
|
||||||
case "freebsd":
|
case "freebsd":
|
||||||
if t.Match(`^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$`) {
|
if t.Match(`^([0-9]+)\s+\S+\s+(?:(?:NO)?STD|COMPAT10)\s+({ \S+\s+(\w+).*)$`) {
|
||||||
num, proto := t.sub[1], t.sub[2]
|
num, proto := t.sub[1], t.sub[2]
|
||||||
name := fmt.Sprintf("SYS_%s", t.sub[3])
|
name := fmt.Sprintf("SYS_%s", t.sub[3])
|
||||||
text += format(name, num, proto)
|
text += format(name, num, proto)
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build openbsd
|
|
||||||
// +build 386 amd64 arm
|
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
12
vendor/golang.org/x/sys/unix/readdirent_getdents.go
generated
vendored
Normal file
12
vendor/golang.org/x/sys/unix/readdirent_getdents.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build aix dragonfly freebsd linux netbsd openbsd
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
// ReadDirent reads directory entries from fd and writes them into buf.
|
||||||
|
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
||||||
|
return Getdents(fd, buf)
|
||||||
|
}
|
19
vendor/golang.org/x/sys/unix/readdirent_getdirentries.go
generated
vendored
Normal file
19
vendor/golang.org/x/sys/unix/readdirent_getdirentries.go
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
// ReadDirent reads directory entries from fd and writes them into buf.
|
||||||
|
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
||||||
|
// Final argument is (basep *uintptr) and the syscall doesn't take nil.
|
||||||
|
// 64 bits should be enough. (32 bits isn't even on 386). Since the
|
||||||
|
// actual system call is getdirentries64, 64 is a good guess.
|
||||||
|
// TODO(rsc): Can we use a single global basep for all calls?
|
||||||
|
var base = (*uintptr)(unsafe.Pointer(new(uint64)))
|
||||||
|
return Getdirentries(fd, buf, base)
|
||||||
|
}
|
8
vendor/golang.org/x/sys/unix/sockcmsg_unix.go
generated
vendored
8
vendor/golang.org/x/sys/unix/sockcmsg_unix.go
generated
vendored
@ -21,10 +21,10 @@ func cmsgAlignOf(salen int) int {
|
|||||||
case "aix":
|
case "aix":
|
||||||
// There is no alignment on AIX.
|
// There is no alignment on AIX.
|
||||||
salign = 1
|
salign = 1
|
||||||
case "darwin", "dragonfly", "solaris":
|
case "darwin", "dragonfly", "solaris", "illumos":
|
||||||
// NOTE: It seems like 64-bit Darwin, DragonFly BSD and
|
// NOTE: It seems like 64-bit Darwin, DragonFly BSD,
|
||||||
// Solaris kernels still require 32-bit aligned access to
|
// illumos, and Solaris kernels still require 32-bit
|
||||||
// network subsystem.
|
// aligned access to network subsystem.
|
||||||
if SizeofPtr == 8 {
|
if SizeofPtr == 8 {
|
||||||
salign = 4
|
salign = 4
|
||||||
}
|
}
|
||||||
|
1
vendor/golang.org/x/sys/unix/syscall.go
generated
vendored
1
vendor/golang.org/x/sys/unix/syscall.go
generated
vendored
@ -50,5 +50,4 @@ func BytePtrFromString(s string) (*byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
||||||
// See mkunix.pl.
|
|
||||||
var _zero uintptr
|
var _zero uintptr
|
||||||
|
26
vendor/golang.org/x/sys/unix/syscall_aix.go
generated
vendored
26
vendor/golang.org/x/sys/unix/syscall_aix.go
generated
vendored
@ -280,8 +280,24 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
|||||||
return -1, ENOSYS
|
return -1, ENOSYS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func direntIno(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntReclen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
|
reclen, ok := direntReclen(buf)
|
||||||
|
if !ok {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
|
||||||
|
}
|
||||||
|
|
||||||
//sys getdirent(fd int, buf []byte) (n int, err error)
|
//sys getdirent(fd int, buf []byte) (n int, err error)
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
func Getdents(fd int, buf []byte) (n int, err error) {
|
||||||
return getdirent(fd, buf)
|
return getdirent(fd, buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,8 +470,8 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|||||||
//sys Dup2(oldfd int, newfd int) (err error)
|
//sys Dup2(oldfd int, newfd int) (err error)
|
||||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64
|
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64
|
||||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
//sys Fchown(fd int, uid int, gid int) (err error)
|
||||||
//sys Fstat(fd int, stat *Stat_t) (err error)
|
//sys fstat(fd int, stat *Stat_t) (err error)
|
||||||
//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat
|
//sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat
|
||||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
|
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
//sys Ftruncate(fd int, length int64) (err error)
|
||||||
//sysnb Getegid() (egid int)
|
//sysnb Getegid() (egid int)
|
||||||
@ -464,7 +480,7 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|||||||
//sysnb Getuid() (uid int)
|
//sysnb Getuid() (uid int)
|
||||||
//sys Lchown(path string, uid int, gid int) (err error)
|
//sys Lchown(path string, uid int, gid int) (err error)
|
||||||
//sys Listen(s int, n int) (err error)
|
//sys Listen(s int, n int) (err error)
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
//sys lstat(path string, stat *Stat_t) (err error)
|
||||||
//sys Pause() (err error)
|
//sys Pause() (err error)
|
||||||
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64
|
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64
|
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64
|
||||||
@ -474,7 +490,7 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|||||||
//sysnb Setreuid(ruid int, euid int) (err error)
|
//sysnb Setreuid(ruid int, euid int) (err error)
|
||||||
//sys Shutdown(fd int, how int) (err error)
|
//sys Shutdown(fd int, how int) (err error)
|
||||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
|
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
//sys stat(path string, statptr *Stat_t) (err error)
|
||||||
//sys Statfs(path string, buf *Statfs_t) (err error)
|
//sys Statfs(path string, buf *Statfs_t) (err error)
|
||||||
//sys Truncate(path string, length int64) (err error)
|
//sys Truncate(path string, length int64) (err error)
|
||||||
|
|
||||||
|
16
vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
generated
vendored
16
vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
generated
vendored
@ -32,3 +32,19 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
|||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Fstat(fd int, stat *Stat_t) error {
|
||||||
|
return fstat(fd, stat)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error {
|
||||||
|
return fstatat(dirfd, path, stat, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Lstat(path string, stat *Stat_t) error {
|
||||||
|
return lstat(path, stat)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Stat(path string, statptr *Stat_t) error {
|
||||||
|
return stat(path, statptr)
|
||||||
|
}
|
||||||
|
47
vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
generated
vendored
47
vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
generated
vendored
@ -32,3 +32,50 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
|||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In order to only have Timespec structure, type of Stat_t's fields
|
||||||
|
// Atim, Mtim and Ctim is changed from StTimespec to Timespec during
|
||||||
|
// ztypes generation.
|
||||||
|
// On ppc64, Timespec.Nsec is an int64 while StTimespec.Nsec is an
|
||||||
|
// int32, so the fields' value must be modified.
|
||||||
|
func fixStatTimFields(stat *Stat_t) {
|
||||||
|
stat.Atim.Nsec >>= 32
|
||||||
|
stat.Mtim.Nsec >>= 32
|
||||||
|
stat.Ctim.Nsec >>= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fstat(fd int, stat *Stat_t) error {
|
||||||
|
err := fstat(fd, stat)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fixStatTimFields(stat)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error {
|
||||||
|
err := fstatat(dirfd, path, stat, flags)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fixStatTimFields(stat)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Lstat(path string, stat *Stat_t) error {
|
||||||
|
err := lstat(path, stat)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fixStatTimFields(stat)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Stat(path string, statptr *Stat_t) error {
|
||||||
|
err := stat(path, statptr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fixStatTimFields(statptr)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
12
vendor/golang.org/x/sys/unix/syscall_bsd.go
generated
vendored
12
vendor/golang.org/x/sys/unix/syscall_bsd.go
generated
vendored
@ -63,15 +63,6 @@ func Setgroups(gids []int) (err error) {
|
|||||||
return setgroups(len(a), &a[0])
|
return setgroups(len(a), &a[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
|
||||||
// Final argument is (basep *uintptr) and the syscall doesn't take nil.
|
|
||||||
// 64 bits should be enough. (32 bits isn't even on 386). Since the
|
|
||||||
// actual system call is getdirentries64, 64 is a good guess.
|
|
||||||
// TODO(rsc): Can we use a single global basep for all calls?
|
|
||||||
var base = (*uintptr)(unsafe.Pointer(new(uint64)))
|
|
||||||
return Getdirentries(fd, buf, base)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait status is 7 bits at bottom, either 0 (exited),
|
// Wait status is 7 bits at bottom, either 0 (exited),
|
||||||
// 0x7F (stopped), or a signal number that caused an exit.
|
// 0x7F (stopped), or a signal number that caused an exit.
|
||||||
// The 0x80 bit is whether there was a core dump.
|
// The 0x80 bit is whether there was a core dump.
|
||||||
@ -86,6 +77,7 @@ const (
|
|||||||
shift = 8
|
shift = 8
|
||||||
|
|
||||||
exited = 0
|
exited = 0
|
||||||
|
killed = 9
|
||||||
stopped = 0x7F
|
stopped = 0x7F
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -112,6 +104,8 @@ func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
|
|||||||
|
|
||||||
func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
|
func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
|
||||||
|
|
||||||
|
func (w WaitStatus) Killed() bool { return w&mask == killed && syscall.Signal(w>>shift) != SIGKILL }
|
||||||
|
|
||||||
func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
|
func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
|
||||||
|
|
||||||
func (w WaitStatus) StopSignal() syscall.Signal {
|
func (w WaitStatus) StopSignal() syscall.Signal {
|
||||||
|
12
vendor/golang.org/x/sys/unix/syscall_darwin.go
generated
vendored
12
vendor/golang.org/x/sys/unix/syscall_darwin.go
generated
vendored
@ -77,6 +77,18 @@ func nametomib(name string) (mib []_C_int, err error) {
|
|||||||
return buf[0 : n/siz], nil
|
return buf[0 : n/siz], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func direntIno(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntReclen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
||||||
|
}
|
||||||
|
|
||||||
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
|
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
|
||||||
func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
|
func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
|
||||||
func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
|
func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
|
||||||
|
17
vendor/golang.org/x/sys/unix/syscall_dragonfly.go
generated
vendored
17
vendor/golang.org/x/sys/unix/syscall_dragonfly.go
generated
vendored
@ -57,6 +57,22 @@ func nametomib(name string) (mib []_C_int, err error) {
|
|||||||
return buf[0 : n/siz], nil
|
return buf[0 : n/siz], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func direntIno(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntReclen(buf []byte) (uint64, bool) {
|
||||||
|
namlen, ok := direntNamlen(buf)
|
||||||
|
if !ok {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return (16 + namlen + 1 + 7) &^ 7, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
||||||
|
}
|
||||||
|
|
||||||
//sysnb pipe() (r int, w int, err error)
|
//sysnb pipe() (r int, w int, err error)
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
func Pipe(p []int) (err error) {
|
||||||
@ -269,6 +285,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
|||||||
//sys Fstatfs(fd int, stat *Statfs_t) (err error)
|
//sys Fstatfs(fd int, stat *Statfs_t) (err error)
|
||||||
//sys Fsync(fd int) (err error)
|
//sys Fsync(fd int) (err error)
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
//sys Ftruncate(fd int, length int64) (err error)
|
||||||
|
//sys Getdents(fd int, buf []byte) (n int, err error)
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
||||||
//sys Getdtablesize() (size int)
|
//sys Getdtablesize() (size int)
|
||||||
//sysnb Getegid() (egid int)
|
//sysnb Getegid() (egid int)
|
||||||
|
126
vendor/golang.org/x/sys/unix/syscall_freebsd.go
generated
vendored
126
vendor/golang.org/x/sys/unix/syscall_freebsd.go
generated
vendored
@ -82,6 +82,18 @@ func nametomib(name string) (mib []_C_int, err error) {
|
|||||||
return buf[0 : n/siz], nil
|
return buf[0 : n/siz], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func direntIno(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntReclen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
||||||
|
}
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
func Pipe(p []int) (err error) {
|
||||||
return Pipe2(p, 0)
|
return Pipe2(p, 0)
|
||||||
}
|
}
|
||||||
@ -362,7 +374,21 @@ func Getdents(fd int, buf []byte) (n int, err error) {
|
|||||||
|
|
||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
||||||
if supportsABI(_ino64First) {
|
if supportsABI(_ino64First) {
|
||||||
return getdirentries_freebsd12(fd, buf, basep)
|
if basep == nil || unsafe.Sizeof(*basep) == 8 {
|
||||||
|
return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep)))
|
||||||
|
}
|
||||||
|
// The freebsd12 syscall needs a 64-bit base. On 32-bit machines
|
||||||
|
// we can't just use the basep passed in. See #32498.
|
||||||
|
var base uint64 = uint64(*basep)
|
||||||
|
n, err = getdirentries_freebsd12(fd, buf, &base)
|
||||||
|
*basep = uintptr(base)
|
||||||
|
if base>>32 != 0 {
|
||||||
|
// We can't stuff the base back into a uintptr, so any
|
||||||
|
// future calls would be suspect. Generate an error.
|
||||||
|
// EIO is allowed by getdirentries.
|
||||||
|
err = EIO
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// The old syscall entries are smaller than the new. Use 1/4 of the original
|
// The old syscall entries are smaller than the new. Use 1/4 of the original
|
||||||
@ -404,22 +430,22 @@ func roundup(x, y int) int {
|
|||||||
|
|
||||||
func (s *Stat_t) convertFrom(old *stat_freebsd11_t) {
|
func (s *Stat_t) convertFrom(old *stat_freebsd11_t) {
|
||||||
*s = Stat_t{
|
*s = Stat_t{
|
||||||
Dev: uint64(old.Dev),
|
Dev: uint64(old.Dev),
|
||||||
Ino: uint64(old.Ino),
|
Ino: uint64(old.Ino),
|
||||||
Nlink: uint64(old.Nlink),
|
Nlink: uint64(old.Nlink),
|
||||||
Mode: old.Mode,
|
Mode: old.Mode,
|
||||||
Uid: old.Uid,
|
Uid: old.Uid,
|
||||||
Gid: old.Gid,
|
Gid: old.Gid,
|
||||||
Rdev: uint64(old.Rdev),
|
Rdev: uint64(old.Rdev),
|
||||||
Atim: old.Atim,
|
Atim: old.Atim,
|
||||||
Mtim: old.Mtim,
|
Mtim: old.Mtim,
|
||||||
Ctim: old.Ctim,
|
Ctim: old.Ctim,
|
||||||
Birthtim: old.Birthtim,
|
Btim: old.Btim,
|
||||||
Size: old.Size,
|
Size: old.Size,
|
||||||
Blocks: old.Blocks,
|
Blocks: old.Blocks,
|
||||||
Blksize: old.Blksize,
|
Blksize: old.Blksize,
|
||||||
Flags: old.Flags,
|
Flags: old.Flags,
|
||||||
Gen: uint64(old.Gen),
|
Gen: uint64(old.Gen),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,6 +533,70 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
|||||||
return sendfile(outfd, infd, offset, count)
|
return sendfile(outfd, infd, offset, count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//sys ptrace(request int, pid int, addr uintptr, data int) (err error)
|
||||||
|
|
||||||
|
func PtraceAttach(pid int) (err error) {
|
||||||
|
return ptrace(PTRACE_ATTACH, pid, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceCont(pid int, signal int) (err error) {
|
||||||
|
return ptrace(PTRACE_CONT, pid, 1, signal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceDetach(pid int) (err error) {
|
||||||
|
return ptrace(PTRACE_DETACH, pid, 1, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) {
|
||||||
|
return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
|
||||||
|
return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceGetRegs(pid int, regsout *Reg) (err error) {
|
||||||
|
return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
||||||
|
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint(countin)}
|
||||||
|
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
||||||
|
return int(ioDesc.Len), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceLwpEvents(pid int, enable int) (err error) {
|
||||||
|
return ptrace(PTRACE_LWPEVENTS, pid, 0, enable)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceLwpInfo(pid int, info uintptr) (err error) {
|
||||||
|
return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{})))
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
|
||||||
|
return PtraceIO(PIOD_READ_D, pid, addr, out, SizeofLong)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
|
||||||
|
return PtraceIO(PIOD_READ_I, pid, addr, out, SizeofLong)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
|
||||||
|
return PtraceIO(PIOD_WRITE_D, pid, addr, data, SizeofLong)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
|
||||||
|
return PtraceIO(PIOD_WRITE_I, pid, addr, data, SizeofLong)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceSetRegs(pid int, regs *Reg) (err error) {
|
||||||
|
return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PtraceSingleStep(pid int) (err error) {
|
||||||
|
return ptrace(PTRACE_SINGLESTEP, pid, 1, 0)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exposed directly
|
* Exposed directly
|
||||||
*/
|
*/
|
||||||
@ -555,7 +645,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
|||||||
//sys Fsync(fd int) (err error)
|
//sys Fsync(fd int) (err error)
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
//sys Ftruncate(fd int, length int64) (err error)
|
||||||
//sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
//sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
|
||||||
//sys getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error)
|
//sys getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error)
|
||||||
//sys Getdtablesize() (size int)
|
//sys Getdtablesize() (size int)
|
||||||
//sysnb Getegid() (egid int)
|
//sysnb Getegid() (egid int)
|
||||||
//sysnb Geteuid() (uid int)
|
//sysnb Geteuid() (uid int)
|
||||||
|
100
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
100
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
@ -13,7 +13,6 @@ package unix
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"net"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
@ -109,6 +108,12 @@ func IoctlGetInt(fd int, req uint) (int, error) {
|
|||||||
return value, err
|
return value, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IoctlGetUint32(fd int, req uint) (uint32, error) {
|
||||||
|
var value uint32
|
||||||
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
|
return value, err
|
||||||
|
}
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
||||||
var value Winsize
|
var value Winsize
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
@ -759,7 +764,7 @@ const px_proto_oe = 0
|
|||||||
|
|
||||||
type SockaddrPPPoE struct {
|
type SockaddrPPPoE struct {
|
||||||
SID uint16
|
SID uint16
|
||||||
Remote net.HardwareAddr
|
Remote []byte
|
||||||
Dev string
|
Dev string
|
||||||
raw RawSockaddrPPPoX
|
raw RawSockaddrPPPoX
|
||||||
}
|
}
|
||||||
@ -910,7 +915,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
|||||||
}
|
}
|
||||||
sa := &SockaddrPPPoE{
|
sa := &SockaddrPPPoE{
|
||||||
SID: binary.BigEndian.Uint16(pp[6:8]),
|
SID: binary.BigEndian.Uint16(pp[6:8]),
|
||||||
Remote: net.HardwareAddr(pp[8:14]),
|
Remote: pp[8:14],
|
||||||
}
|
}
|
||||||
for i := 14; i < 14+IFNAMSIZ; i++ {
|
for i := 14; i < 14+IFNAMSIZ; i++ {
|
||||||
if pp[i] == 0 {
|
if pp[i] == 0 {
|
||||||
@ -1408,8 +1413,20 @@ func Reboot(cmd int) (err error) {
|
|||||||
return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
|
return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
|
func direntIno(buf []byte) (uint64, bool) {
|
||||||
return Getdents(fd, buf)
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntReclen(buf []byte) (uint64, bool) {
|
||||||
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
|
||||||
|
}
|
||||||
|
|
||||||
|
func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
|
reclen, ok := direntReclen(buf)
|
||||||
|
if !ok {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error)
|
//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error)
|
||||||
@ -1444,6 +1461,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
|||||||
//sys Acct(path string) (err error)
|
//sys Acct(path string) (err error)
|
||||||
//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error)
|
//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error)
|
||||||
//sys Adjtimex(buf *Timex) (state int, err error)
|
//sys Adjtimex(buf *Timex) (state int, err error)
|
||||||
|
//sys Capget(hdr *CapUserHeader, data *CapUserData) (err error)
|
||||||
|
//sys Capset(hdr *CapUserHeader, data *CapUserData) (err error)
|
||||||
//sys Chdir(path string) (err error)
|
//sys Chdir(path string) (err error)
|
||||||
//sys Chroot(path string) (err error)
|
//sys Chroot(path string) (err error)
|
||||||
//sys ClockGetres(clockid int32, res *Timespec) (err error)
|
//sys ClockGetres(clockid int32, res *Timespec) (err error)
|
||||||
@ -1531,9 +1550,13 @@ func Setgid(uid int) (err error) {
|
|||||||
return EOPNOTSUPP
|
return EOPNOTSUPP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
|
||||||
|
return signalfd(fd, sigmask, _C__NSIG/8, flags)
|
||||||
|
}
|
||||||
|
|
||||||
//sys Setpriority(which int, who int, prio int) (err error)
|
//sys Setpriority(which int, who int, prio int) (err error)
|
||||||
//sys Setxattr(path string, attr string, data []byte, flags int) (err error)
|
//sys Setxattr(path string, attr string, data []byte, flags int) (err error)
|
||||||
//sys Signalfd(fd int, mask *Sigset_t, flags int) = SYS_SIGNALFD4
|
//sys signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) = SYS_SIGNALFD4
|
||||||
//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error)
|
//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error)
|
||||||
//sys Sync()
|
//sys Sync()
|
||||||
//sys Syncfs(fd int) (err error)
|
//sys Syncfs(fd int) (err error)
|
||||||
@ -1675,6 +1698,69 @@ type fileHandle struct {
|
|||||||
Type int32
|
Type int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FileHandle represents the C struct file_handle used by
|
||||||
|
// name_to_handle_at (see NameToHandleAt) and open_by_handle_at (see
|
||||||
|
// OpenByHandleAt).
|
||||||
|
type FileHandle struct {
|
||||||
|
*fileHandle
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFileHandle constructs a FileHandle.
|
||||||
|
func NewFileHandle(handleType int32, handle []byte) FileHandle {
|
||||||
|
const hdrSize = unsafe.Sizeof(fileHandle{})
|
||||||
|
buf := make([]byte, hdrSize+uintptr(len(handle)))
|
||||||
|
copy(buf[hdrSize:], handle)
|
||||||
|
fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
|
||||||
|
fh.Type = handleType
|
||||||
|
fh.Bytes = uint32(len(handle))
|
||||||
|
return FileHandle{fh}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fh *FileHandle) Size() int { return int(fh.fileHandle.Bytes) }
|
||||||
|
func (fh *FileHandle) Type() int32 { return fh.fileHandle.Type }
|
||||||
|
func (fh *FileHandle) Bytes() []byte {
|
||||||
|
n := fh.Size()
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n]
|
||||||
|
}
|
||||||
|
|
||||||
|
// NameToHandleAt wraps the name_to_handle_at system call; it obtains
|
||||||
|
// a handle for a path name.
|
||||||
|
func NameToHandleAt(dirfd int, path string, flags int) (handle FileHandle, mountID int, err error) {
|
||||||
|
var mid _C_int
|
||||||
|
// Try first with a small buffer, assuming the handle will
|
||||||
|
// only be 32 bytes.
|
||||||
|
size := uint32(32 + unsafe.Sizeof(fileHandle{}))
|
||||||
|
didResize := false
|
||||||
|
for {
|
||||||
|
buf := make([]byte, size)
|
||||||
|
fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
|
||||||
|
fh.Bytes = size - uint32(unsafe.Sizeof(fileHandle{}))
|
||||||
|
err = nameToHandleAt(dirfd, path, fh, &mid, flags)
|
||||||
|
if err == EOVERFLOW {
|
||||||
|
if didResize {
|
||||||
|
// We shouldn't need to resize more than once
|
||||||
|
return
|
||||||
|
}
|
||||||
|
didResize = true
|
||||||
|
size = fh.Bytes + uint32(unsafe.Sizeof(fileHandle{}))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return FileHandle{fh}, int(mid), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenByHandleAt wraps the open_by_handle_at system call; it opens a
|
||||||
|
// file via a handle as previously returned by NameToHandleAt.
|
||||||
|
func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err error) {
|
||||||
|
return openByHandleAt(mountFD, handle.fileHandle, flags)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
@ -1682,8 +1768,6 @@ type fileHandle struct {
|
|||||||
// Alarm
|
// Alarm
|
||||||
// ArchPrctl
|
// ArchPrctl
|
||||||
// Brk
|
// Brk
|
||||||
// Capget
|
|
||||||
// Capset
|
|
||||||
// ClockNanosleep
|
// ClockNanosleep
|
||||||
// ClockSettime
|
// ClockSettime
|
||||||
// Clone
|
// Clone
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user