From 1bf947869322befa2811b8fbe55dd0dbbf81eb2d Mon Sep 17 00:00:00 2001 From: Zhang Dongliang Date: Fri, 28 Sep 2018 11:24:51 +0800 Subject: [PATCH] autoupdate support for onecloud --- Gopkg.lock | 279 +++++++++++++----- cmd/climc/shell/updates.go | 47 +++ pkg/mcclient/modules/managers.go | 10 +- pkg/mcclient/modules/mod_updates.go | 31 ++ .../excelize/.travis.yml | 11 + .../excelize/CONTRIBUTING.md | 19 +- .../360EntSecGroup-Skylar/excelize/README.md | 2 +- .../excelize/README_zh.md | 2 +- .../360EntSecGroup-Skylar/excelize/cell.go | 115 ++++++-- .../360EntSecGroup-Skylar/excelize/chart.go | 109 ++++--- .../360EntSecGroup-Skylar/excelize/col.go | 37 ++- .../360EntSecGroup-Skylar/excelize/comment.go | 97 ++++-- .../360EntSecGroup-Skylar/excelize/date.go | 59 +++- .../excelize/excelize.go | 48 +-- .../excelize/excelize.png | Bin 43470 -> 54188 bytes .../360EntSecGroup-Skylar/excelize/file.go | 42 ++- .../360EntSecGroup-Skylar/excelize/lib.go | 53 ++-- .../360EntSecGroup-Skylar/excelize/picture.go | 157 ++++++---- .../360EntSecGroup-Skylar/excelize/rows.go | 62 ++-- .../360EntSecGroup-Skylar/excelize/shape.go | 33 ++- .../360EntSecGroup-Skylar/excelize/sheet.go | 132 +++++---- .../360EntSecGroup-Skylar/excelize/sheetpr.go | 13 +- .../excelize/sheetview.go | 9 + .../360EntSecGroup-Skylar/excelize/styles.go | 276 ++++++++++------- .../360EntSecGroup-Skylar/excelize/table.go | 72 +++-- .../excelize/templates.go | 13 +- .../excelize/vmlDrawing.go | 9 + .../excelize/xmlChart.go | 9 + .../excelize/xmlComments.go | 17 ++ .../excelize/xmlContentTypes.go | 9 + .../excelize/xmlDecodeDrawing.go | 9 + .../excelize/xmlDrawing.go | 9 + .../excelize/xmlSharedStrings.go | 9 + .../excelize/xmlStyles.go | 9 + .../excelize/xmlTable.go | 9 + .../excelize/xmlWorkbook.go | 9 + .../excelize/xmlWorksheet.go | 42 ++- .../Azure/go-autorest/autorest/sender.go | 2 +- .../Azure/go-autorest/version/version.go | 2 +- vendor/github.com/Shopify/sarama/.travis.yml | 8 +- vendor/github.com/Shopify/sarama/CHANGELOG.md | 16 + vendor/github.com/Shopify/sarama/Makefile | 2 +- vendor/github.com/Shopify/sarama/README.md | 2 +- vendor/github.com/Shopify/sarama/config.go | 89 +++++- vendor/github.com/Shopify/sarama/dev.yml | 2 +- .../Shopify/sarama/metadata_response.go | 11 + .../Shopify/sarama/offset_manager.go | 46 ++- .../googollee/go-socket.io/.travis.yml | 4 +- .../googollee/go-socket.io/server.go | 4 +- vendor/github.com/miekg/dns/scan_rr.go | 6 +- vendor/github.com/miekg/dns/server.go | 18 ++ vendor/github.com/miekg/dns/version.go | 2 +- .../prometheus/procfs/fixtures.ttar | 16 + vendor/github.com/prometheus/procfs/proc.go | 20 ++ vendor/github.com/sirupsen/logrus/.travis.yml | 58 +++- .../github.com/sirupsen/logrus/CHANGELOG.md | 30 ++ vendor/github.com/sirupsen/logrus/entry.go | 40 +-- vendor/github.com/sirupsen/logrus/exported.go | 19 +- .../sirupsen/logrus/json_formatter.go | 21 +- vendor/github.com/sirupsen/logrus/logger.go | 82 +++-- vendor/github.com/sirupsen/logrus/logrus.go | 7 + .../sirupsen/logrus/terminal_bsd.go | 11 +- .../logrus/terminal_check_appengine.go | 2 +- .../logrus/terminal_check_notappengine.go | 2 +- .../sirupsen/logrus/terminal_linux.go | 11 +- .../sirupsen/logrus/text_formatter.go | 84 +++++- vendor/golang.org/x/net/http2/write.go | 2 +- vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 12 +- vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 12 +- vendor/golang.org/x/sys/unix/ioctl.go | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 18 ++ vendor/golang.org/x/sys/unix/syscall_aix.go | 6 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 29 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 17 ++ vendor/golang.org/x/sys/unix/types_aix.go | 9 +- vendor/golang.org/x/sys/unix/types_netbsd.go | 6 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 12 + .../x/sys/unix/zerrors_aix_ppc64.go | 12 + .../x/sys/unix/zerrors_dragonfly_amd64.go | 34 +++ .../x/sys/unix/zerrors_linux_386.go | 22 ++ .../x/sys/unix/zerrors_linux_amd64.go | 22 ++ .../x/sys/unix/zerrors_linux_arm.go | 22 ++ .../x/sys/unix/zerrors_linux_arm64.go | 22 ++ .../x/sys/unix/zerrors_linux_mips.go | 22 ++ .../x/sys/unix/zerrors_linux_mips64.go | 22 ++ .../x/sys/unix/zerrors_linux_mips64le.go | 22 ++ .../x/sys/unix/zerrors_linux_mipsle.go | 22 ++ .../x/sys/unix/zerrors_linux_ppc64.go | 22 ++ .../x/sys/unix/zerrors_linux_ppc64le.go | 22 ++ .../x/sys/unix/zerrors_linux_riscv64.go | 22 ++ .../x/sys/unix/zerrors_linux_s390x.go | 22 ++ .../x/sys/unix/zerrors_netbsd_386.go | 40 +++ .../x/sys/unix/zerrors_netbsd_amd64.go | 40 +++ .../x/sys/unix/zerrors_netbsd_arm.go | 40 +++ .../x/sys/unix/zerrors_openbsd_386.go | 26 ++ .../x/sys/unix/zerrors_openbsd_amd64.go | 26 ++ .../x/sys/unix/zerrors_openbsd_arm.go | 26 ++ .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 24 ++ .../x/sys/unix/zsyscall_aix_ppc64.go | 24 ++ .../x/sys/unix/zsyscall_linux_386.go | 10 + .../x/sys/unix/zsyscall_linux_amd64.go | 10 + .../x/sys/unix/zsyscall_linux_arm.go | 10 + .../x/sys/unix/zsyscall_linux_arm64.go | 10 + .../x/sys/unix/zsyscall_linux_mips.go | 10 + .../x/sys/unix/zsyscall_linux_mips64.go | 10 + .../x/sys/unix/zsyscall_linux_mips64le.go | 10 + .../x/sys/unix/zsyscall_linux_mipsle.go | 10 + .../x/sys/unix/zsyscall_linux_ppc64.go | 12 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 12 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 12 +- .../x/sys/unix/zsyscall_linux_s390x.go | 12 +- .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 45 ++- .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 47 ++- .../golang.org/x/sys/unix/ztypes_linux_386.go | 48 +++ .../x/sys/unix/ztypes_linux_amd64.go | 48 +++ .../golang.org/x/sys/unix/ztypes_linux_arm.go | 48 +++ .../x/sys/unix/ztypes_linux_arm64.go | 48 +++ .../x/sys/unix/ztypes_linux_mips.go | 48 +++ .../x/sys/unix/ztypes_linux_mips64.go | 48 +++ .../x/sys/unix/ztypes_linux_mips64le.go | 48 +++ .../x/sys/unix/ztypes_linux_mipsle.go | 48 +++ .../x/sys/unix/ztypes_linux_ppc64.go | 48 +++ .../x/sys/unix/ztypes_linux_ppc64le.go | 48 +++ .../x/sys/unix/ztypes_linux_riscv64.go | 48 +++ .../x/sys/unix/ztypes_linux_s390x.go | 48 +++ .../x/sys/unix/ztypes_netbsd_386.go | 10 + .../x/sys/unix/ztypes_netbsd_amd64.go | 10 + .../x/sys/unix/ztypes_netbsd_arm.go | 10 + 128 files changed, 3267 insertions(+), 725 deletions(-) create mode 100644 cmd/climc/shell/updates.go create mode 100644 pkg/mcclient/modules/mod_updates.go diff --git a/Gopkg.lock b/Gopkg.lock index 4776167d56..f3ba09081e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,12 +2,49 @@ [[projects]] - digest = "1:4b94878e125f31ec67c892ecfe38c13211da40653281588598218f807ae72bf7" + digest = "1:a151d8abdc2ab0a97060ac2e7c71472dff76255d76d5e65d29dcf21cf0ae0664" name = "github.com/360EntSecGroup-Skylar/excelize" packages = ["."] pruneopts = "UT" - revision = "eb62256d165607c6877ce88efbba10c119137b3d" - version = "v1.3.0" + revision = "3e004d900b103379c2d62657a3070de4a2e8585a" + version = "v1.4.0" + +[[projects]] + digest = "1:402c5ecf012012f4a6ff2bcc6ee903f5280e8c27f4abaebb2319716065397304" + name = "github.com/Azure/azure-sdk-for-go" + packages = [ + "services/compute/mgmt/2018-04-01/compute", + "services/compute/mgmt/2018-06-01/compute", + "services/consumption/mgmt/2018-03-31/consumption", + "services/network/mgmt/2018-06-01/network", + "services/preview/subscription/mgmt/2018-03-01-preview/subscription", + "services/resources/mgmt/2018-05-01/resources", + "services/storage/mgmt/2017-10-01/storage", + "services/storage/mgmt/2018-02-01/storage", + "storage", + "version", + ] + pruneopts = "UT" + revision = "4e8cbbfb1aeab140cd0fa97fd16b64ee18c3ca6a" + version = "v19.1.0" + +[[projects]] + digest = "1:b8a61bb5402d1b01ada88ccb213da33a5d29683cba5ce93813aa67d5826afe56" + name = "github.com/Azure/go-autorest" + packages = [ + "autorest", + "autorest/adal", + "autorest/azure", + "autorest/azure/auth", + "autorest/date", + "autorest/to", + "autorest/validation", + "logger", + "version", + ] + pruneopts = "UT" + revision = "9bc4033dd347c7f416fca46b2f42a043dc1fbdf6" + version = "v10.15.5" [[projects]] digest = "1:f7a3877d7116adfcdcd641f9f6ad18fc2126bd5c080d8854cc3b395a01e0b7f3" @@ -22,15 +59,37 @@ version = "v0.6.1" [[projects]] - digest = "1:66b8ed452b31eb9075bc53295952487c333a9cb555de57ed61f5664c058d9050" + branch = "master" + digest = "1:13cce9b5c224cb93ecbfce7495a7d8ac291a3a1cb17827fbeb593f5905902164" + name = "github.com/Microsoft/azure-vhd-utils" + packages = [ + "vhdcore", + "vhdcore/bat", + "vhdcore/block", + "vhdcore/block/bitmap", + "vhdcore/common", + "vhdcore/diskstream", + "vhdcore/footer", + "vhdcore/header", + "vhdcore/header/parentlocator", + "vhdcore/reader", + "vhdcore/validator", + "vhdcore/vhdfile", + "vhdcore/writer", + ] + pruneopts = "UT" + revision = "2dd43d88c85c06c55828c86159d4583db9d41fbb" + +[[projects]] + digest = "1:6981402aef27693f4b2ec619117abd263fde29f8c1dfac46eef0f35038d37513" name = "github.com/Shopify/sarama" packages = ["."] pruneopts = "UT" - revision = "35324cf48e33d8260e1c7c18854465a904ade249" - version = "v1.17.0" + revision = "ec843464b50d4c8b56403ec9d589cf41ea30e722" + version = "v1.19.0" [[projects]] - digest = "1:37a8ee6652ff3c42043fa26c0930858d1a72f26928ae26e5261fe81c5f0c2e8d" + digest = "1:5e9ea5618cb3451ce312505a48a563e95ce26c9ef498cd0a8833255e5e7f5c61" name = "github.com/aliyun/alibaba-cloud-sdk-go" packages = [ "sdk", @@ -44,16 +103,16 @@ "sdk/utils", ] pruneopts = "UT" - revision = "f53c66e9cf53d68bcf063643c09cc667efa0e613" - version = "1.23.3" + revision = "e61479d8220e534e78523e75ff42f92e8d5ac6e1" + version = "1.31.0" [[projects]] - digest = "1:fff66556e25e676b296f9f2c78853831911e6ae41d84303a9be7a534bd1c0901" + digest = "1:5a2d4da3f703696f4bec1ba1d363f50461b72934b1817c07ab0963496ed1c90d" name = "github.com/aliyun/aliyun-oss-go-sdk" packages = ["oss"] pruneopts = "UT" - revision = "36bf7aa2f916f274137aedd05d1d36f6a3c0f4a6" - version = "1.9.0" + revision = "ddc87ec2145f324f91257266e657cd7fa0ff1c8c" + version = "1.9.1" [[projects]] digest = "1:8f5416c7f59da8600725ae1ff00a99af1da8b04c211ae6f3c8f8bcab0164f650" @@ -95,7 +154,7 @@ version = "v0.2.2" [[projects]] - digest = "1:40098afbdd06a76dee4b6bcb85a22fed81ac9d2ebaf775c91e558c80f57aaff1" + digest = "1:7205ab9c5433db402268526647efc47daa3236f9a85a1faba705fda12fdafd29" name = "github.com/coredns/coredns" packages = [ "core/dnsserver", @@ -148,16 +207,32 @@ "request", ] pruneopts = "UT" - revision = "2e322f6e8a54f18c6aef9c25a7c432c291a3d9f7" - version = "v1.2.0" + revision = "eb51e8bac90fac86d34c9e1cb89b04ea0936b034" + version = "v1.2.2" [[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" name = "github.com/davecgh/go-spew" packages = ["spew"] pruneopts = "UT" - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55" + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + pruneopts = "UT" + revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" + version = "v3.2.0" + +[[projects]] + branch = "master" + digest = "1:e608bc2d867c3ded40ccea5417715393a50704ac24004afa87431a0e1976e50d" + name = "github.com/dimchansky/utfbom" + packages = ["."] + pruneopts = "UT" + revision = "5448fe645cb1964ba70ac8f9f2ffe975e61a536c" [[projects]] branch = "master" @@ -177,11 +252,11 @@ [[projects]] branch = "master" - digest = "1:0448d1c1a596941c608762912fe7c865f88d9ffa45afb8af1edcf1401762bf7e" + digest = "1:79f16588b5576b1b3cd90e48d2374cc9a1a8776862d28d8fd0f23b0e15534967" name = "github.com/eapache/go-xerial-snappy" packages = ["."] pruneopts = "UT" - revision = "040cc1a32f578808623071247fdbd5cc43f37f5f" + revision = "776d5712da21bc4762676d614db1d8a64f4238b0" [[projects]] digest = "1:444b82bfe35c83bbcaf84e310fb81a1f9ece03edfed586483c869e2c046aef69" @@ -197,7 +272,7 @@ name = "github.com/farsightsec/golang-framestream" packages = ["."] pruneopts = "UT" - revision = "c06a5734334d9629b3db143d74b47eb94ea68612" + revision = "d0f7ed81b7afcc56d3c1a66a0fd26a1b609675f3" [[projects]] digest = "1:865079840386857c809b72ce300be7580cb50d3d3129ce11bf9aa6ca2bc1934a" @@ -232,15 +307,16 @@ revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae" [[projects]] - digest = "1:ab00ecdc9607692ffd5fb1ac21a9ba2d6cc95bae011f327022c0b1c323d218e2" + digest = "1:ff09f03ca12c4d23c28c596eb0738745e36c1cac111f62f64819210f40607cd2" name = "github.com/gin-gonic/gin" packages = [ "binding", + "json", "render", ] pruneopts = "UT" - revision = "d459835d2b077e44f7c9b453505ee29881d5d12d" - version = "v1.2" + revision = "b869fe1415e4b9eb52f247441830d502aece2d4d" + version = "v1.3.0" [[projects]] digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" @@ -303,7 +379,7 @@ revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" [[projects]] - digest = "1:17fe264ee908afc795734e8c4e63db2accabaf57326dbf21763a7d6b86096260" + digest = "1:4c0989ca0bcd10799064318923b9bc2db6b4d6338dd75f3f2d86c3511aaaf5cf" name = "github.com/golang/protobuf" packages = [ "proto", @@ -313,8 +389,8 @@ "ptypes/timestamp", ] pruneopts = "UT" - revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" - version = "v1.1.0" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" [[projects]] branch = "master" @@ -326,11 +402,11 @@ [[projects]] branch = "master" - digest = "1:9887333bbef17574b1db5f9893ea137ac44107235d624408a3ac9e0b98fbb2cb" + digest = "1:0bfbe13936953a98ae3cfe8ed6670d396ad81edf069a806d2f6515d7bb6950df" name = "github.com/google/btree" packages = ["."] pruneopts = "UT" - revision = "e89373fe6b4a7413d7acd6da1725b83ef713e6e4" + revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306" [[projects]] branch = "master" @@ -341,12 +417,12 @@ revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" [[projects]] - digest = "1:8f8811f9be822914c3a25c6a071e93beb4c805d7b026cbf298bc577bc1cc945b" + digest = "1:3a26588bc48b96825977c1b3df964f8fd842cd6860cc26370588d3563433cf11" name = "github.com/google/uuid" packages = ["."] pruneopts = "UT" - revision = "064e2069ce9c359c118179501254f67d7d37ba24" - version = "0.2" + revision = "d460ce9f8df2e77fb1ba55ca87fafed96c607494" + version = "v1.0.0" [[projects]] digest = "1:65c4414eeb350c47b8de71110150d0ea8a281835b1f386eacaa3ad7325929c21" @@ -377,11 +453,11 @@ [[projects]] branch = "master" - digest = "1:62db7727ec8e026e51e1b46696e0fdf6a956a701032eca4d63e311816820717c" + digest = "1:8ec54d9488698e9db22139250bde10e35aab02c20236e4d1c1457604c2c4fe18" name = "github.com/googollee/go-socket.io" packages = ["."] pruneopts = "UT" - revision = "f12da5711bc66c18a0724987fff7f4f3db35c70f" + revision = "25e1f67559cf5d0e41efbc3e0157bb952596ffc3" [[projects]] digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" @@ -482,12 +558,20 @@ version = "0.2.2" [[projects]] - digest = "1:eaefc85d32c03e5f0c2b88ea2f79fce3d993e2c78316d21319575dd4ea9153ca" + digest = "1:3e551bbb3a7c0ab2a2bf4660e7fcad16db089fdcfbb44b0199e62838038623ea" name = "github.com/json-iterator/go" packages = ["."] pruneopts = "UT" - revision = "ab8a2e0c74be9d3be70b3184d9acc634935ded82" - version = "1.1.4" + revision = "1624edc4454b8682399def8740d46db5e4362ba4" + version = "v1.1.5" + +[[projects]] + branch = "master" + digest = "1:f44d34fda864bed6d6c71514cd40b2ee097e6e67f745d5d014113e1faa5af8b7" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "UT" + revision = "b729f2633dfe35f4d1d8a32385f6685610ce1cb5" [[projects]] branch = "master" @@ -499,11 +583,19 @@ [[projects]] branch = "master" - digest = "1:094e04c4742b596bce4455eb535d4e4365016b44016db76f8593211406d77299" + digest = "1:29d28429a93b076908a36420a7ecb2bf429d24c15a4b5e2c220ea00fc84b71af" name = "github.com/kr/pty" packages = ["."] pruneopts = "UT" - revision = "fa756f09eeb418bf1cc6268c66ceaad9bb98f598" + revision = "db8e3cd836b82e82e0a9c8edc6896967dd31374f" + +[[projects]] + digest = "1:4e878df5f4e9fd625bf9c9aac77ef7cbfa4a74c01265505527c23470c0e40300" + name = "github.com/marstr/guid" + packages = ["."] + pruneopts = "UT" + revision = "8bd9a64bf37eb297b492a4101fb28e80ac0b290f" + version = "v1.1.0" [[projects]] digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67" @@ -514,12 +606,12 @@ version = "v0.0.9" [[projects]] - digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" + digest = "1:0981502f9816113c9c8c4ac301583841855c8cf4da8c72f696b3ebedf6d0e4e5" name = "github.com/mattn/go-isatty" packages = ["."] pruneopts = "UT" - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" + revision = "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c" + version = "v0.0.4" [[projects]] branch = "master" @@ -531,11 +623,11 @@ [[projects]] branch = "master" - digest = "1:d775613e6db40f54d34cc8b319ee5c2df56752f9f5e55e2f6004d11684bdc8fd" + digest = "1:325f68c3bd3044dcf51d46e802136cd239817e1fb130b5f3466a4cec4dd427d3" name = "github.com/mattn/go-tty" packages = ["."] pruneopts = "UT" - revision = "931426f7535ac39720c8909d70ece5a41a2502a6" + revision = "13ff1204f104d52c3f7645ec027ecbcf9026429e" [[projects]] digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" @@ -567,12 +659,12 @@ version = "v0.10.11" [[projects]] - digest = "1:463e4140189f8194f9121ca1c7fe3b8e9e9a2ab3d949b43c835c21034927dc62" + digest = "1:b39aee4261f1ae13fdd21a0db189e0bba0f96c0f2eba77ab278428e2d3b00052" name = "github.com/miekg/dns" packages = ["."] pruneopts = "UT" - revision = "5a2b9fab83ff0f8bfc99684bd5f43a37abe560f1" - version = "v1.0.8" + revision = "f4db2ca6edc3af0ee51bf332099cc480bcf3ef9d" + version = "v1.0.10" [[projects]] digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" @@ -590,6 +682,14 @@ revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" version = "1.0.1" +[[projects]] + branch = "master" + digest = "1:84bd7f8a2e0bcd53ddc33c3b47c34c1fe340c8632cbe928f7f8ae10ec6ecdd62" + name = "github.com/mohae/deepcopy" + packages = ["."] + pruneopts = "UT" + revision = "c48cc78d482608239f6c4c92a4abd87eb8761c90" + [[projects]] branch = "master" digest = "1:7aefb397a53fc437c90f0fdb3e1419c751c5a3a165ced52325d5d797edf1aca6" @@ -650,15 +750,15 @@ version = "v2.0.1" [[projects]] - digest = "1:29803f52611cbcc1dfe55b456e9fdac362af7248b3d29d7ea1bec0a12e71dff4" + digest = "1:4f0885b3f0dba96128a09a6f4b4231c42688fbd05f323224c6aa5adc9f4e87bf" name = "github.com/pierrec/lz4" packages = [ ".", "internal/xxh32", ] pruneopts = "UT" - revision = "1958fd8fff7f115e79725b1288e0b878b3e06b00" - version = "v2.0.3" + revision = "bb6bfd13c6a262f1943c0446eb25b7f54c1fb9a2" + version = "v2.0.6" [[projects]] branch = "master" @@ -666,7 +766,7 @@ name = "github.com/pkg/term" packages = ["termios"] pruneopts = "UT" - revision = "cda20d4ac917ad418d86e151eff439648b06185b" + revision = "bffc007b7fd5a70e20e28f5b7649bb84671ef436" [[projects]] digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" @@ -697,7 +797,7 @@ [[projects]] branch = "master" - digest = "1:e469cd65badf7694aeb44874518606d93c1d59e7735d3754ad442782437d3cc3" + digest = "1:63b68062b8968092eb86bedc4e68894bd096ea6b24920faca8b9dcf451f54bb5" name = "github.com/prometheus/common" packages = [ "expfmt", @@ -705,11 +805,11 @@ "model", ] pruneopts = "UT" - revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" + revision = "c7de2306084e37d54b8be01f3541a8464345e9a5" [[projects]] branch = "master" - digest = "1:8c49953a1414305f2ff5465147ee576dd705487c35b15918fcd4efdc0cb7a290" + digest = "1:ef1dd9945e58ee9b635273d28c0ef3fa3742a7dedc038ebe207fd63e6ce000ef" name = "github.com/prometheus/procfs" packages = [ ".", @@ -718,7 +818,7 @@ "xfs", ] pruneopts = "UT" - revision = "05ee40e3a273f7245e8777337fc7b46e533a9a92" + revision = "418d78d0b9a7b7de3a6bbc8a23def624cc977bb2" [[projects]] branch = "master" @@ -745,20 +845,28 @@ revision = "49a4782e9908fe098c907022a1bd7519c79803d6" [[projects]] - digest = "1:d867dfa6751c8d7a435821ad3b736310c2ed68945d05b50fb9d23aee0540c8cc" + digest = "1:81e02c4edb639c80559c0650f9401d3e2dcc3256d1fa215382bb7c83c1db9126" + name = "github.com/shopspring/decimal" + packages = ["."] + pruneopts = "UT" + revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" + version = "1.1.0" + +[[projects]] + digest = "1:dc2d85c13ac22c22a1f3170a41a8e1b897fa05134aaf533f16df44f66a25b4a1" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "3e01752db0189b9157070a0e1668a620f9a85da2" - version = "v1.0.6" + revision = "a67f783a3814b8729bd2dac5780b5f78f8dbd64d" + version = "v1.1.0" [[projects]] - digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" + digest = "1:dab83a1bbc7ad3d7a6ba1a1cc1760f25ac38cdf7d96a5cdd55cd915a4f5ceaf9" name = "github.com/spf13/pflag" packages = ["."] pruneopts = "UT" - revision = "583c0c0531f06d5278b7d917446061adc344b5cd" - version = "v1.0.1" + revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" + version = "v1.0.2" [[projects]] digest = "1:18752d0b95816a1b777505a97f71c7467a8445b8ffb55631a7bf779f6ba4fa83" @@ -785,7 +893,7 @@ [[projects]] branch = "master" - digest = "1:91771429c8de08d4d9b32663ad78bfa8ee1e0a146e921d9937c117665fd0377f" + digest = "1:35f0192bdf8cdd76e1851c53e293c92c058c20870ccb0af1a292f5e64075fe40" name = "github.com/vmware/govmomi" packages = [ ".", @@ -805,11 +913,11 @@ "vim25/xml", ] pruneopts = "UT" - revision = "bbd99532a768d2fe369079ceda730e30726ae1a6" + revision = "c8ddb4b2bcda00a066d84c889dbb40d1aa9f2519" [[projects]] branch = "master" - digest = "1:014ee502e4880ffba2a0103cefa6af78cf8767ce08bc29376e6b86cdcaa2ec06" + digest = "1:71c5989353531072eeb9547066e05bdeaaf9ef0512673bca3b4b824092d70de3" name = "golang.org/x/crypto" packages = [ "curve25519", @@ -817,16 +925,18 @@ "ed25519/internal/edwards25519", "internal/chacha20", "internal/subtle", + "pkcs12", + "pkcs12/internal/rc2", "poly1305", "ssh", "ssh/terminal", ] pruneopts = "UT" - revision = "c126467f60eb25f8f27e5a981f32a87e3965053f" + revision = "5295e8364332db77d75fce11f1d19c053919a9c9" [[projects]] branch = "master" - digest = "1:c945d925a3dae287abe075a89c6b09e1015da39d350eb512bb5d01ebcd7783e7" + digest = "1:4ab551743538ce88c540073958b2fb653ca077c5d4c3d1991d86016dd38e22f6" name = "golang.org/x/net" packages = [ "bpf", @@ -843,18 +953,18 @@ "trace", ] pruneopts = "UT" - revision = "f4c29de78a2a91c00474a2e689954305c350adf9" + revision = "4dfa2610cdf3b287375bbba5b8f2a14d3b01d8de" [[projects]] branch = "master" - digest = "1:be95d758fc4d9216e5d41ff5b98b46938fba85ca5bc2ddc45a1b03e2bb10fe7c" + digest = "1:2c607ffa8a0a34a9acba4aba7b33d981b5a2150bfcec41b1f2ef1d791bcf6c14" name = "golang.org/x/sys" packages = [ "unix", "windows", ] pruneopts = "UT" - revision = "e072cadbbdc8dd3d3ffa82b8b4b9304c261d9311" + revision = "dad3d9fb7b6e83d0f9ac8f54670f6334c3a287b4" [[projects]] digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" @@ -892,19 +1002,19 @@ name = "google.golang.org/appengine" packages = ["cloudsql"] pruneopts = "UT" - revision = "b1f26356af11148e710935ed1ac8a7f5702c7612" - version = "v1.1.0" + revision = "ae0ab99deb4dc413a2b4bd6c8bdd0eb67f1e4d06" + version = "v1.2.0" [[projects]] branch = "master" - digest = "1:077c1c599507b3b3e9156d17d36e1e61928ee9b53a5b420f10f28ebd4a0b275c" + digest = "1:56b0bca90b7e5d1facf5fbdacba23e4e0ce069d25381b8e2f70ef1e7ebfb9c1a" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] pruneopts = "UT" - revision = "daca94659cb50e9f37c1b834680f2e46358f10b0" + revision = "0e822944c569bf5c9afd034adaa56208bd2906ac" [[projects]] - digest = "1:3dd7996ce6bf52dec6a2f69fa43e7c4cefea1d4dfa3c8ab7a5f8a9f7434e239d" + digest = "1:ab8e92d746fb5c4c18846b0879842ac8e53b3d352449423d0924a11f1020ae1b" name = "google.golang.org/grpc" packages = [ ".", @@ -935,8 +1045,8 @@ "tap", ] pruneopts = "UT" - revision = "32fb0ac620c32ba40a4626ddf94d90d12cce3455" - version = "v1.14.0" + revision = "8dea3dc473e90c8179e519d91302d0597c0ca1d1" + version = "v1.15.0" [[projects]] digest = "1:2655728699af00d823b0a68bd7169fd241a30c04252f456b34421908701b9c3f" @@ -1189,6 +1299,23 @@ analyzer-version = 1 input-imports = [ "github.com/360EntSecGroup-Skylar/excelize", + "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-04-01/compute", + "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-06-01/compute", + "github.com/Azure/azure-sdk-for-go/services/consumption/mgmt/2018-03-31/consumption", + "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-06-01/network", + "github.com/Azure/azure-sdk-for-go/services/preview/subscription/mgmt/2018-03-01-preview/subscription", + "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2018-05-01/resources", + "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2017-10-01/storage", + "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-02-01/storage", + "github.com/Azure/azure-sdk-for-go/storage", + "github.com/Azure/go-autorest/autorest", + "github.com/Azure/go-autorest/autorest/azure", + "github.com/Azure/go-autorest/autorest/azure/auth", + "github.com/Microsoft/azure-vhd-utils/vhdcore/block/bitmap", + "github.com/Microsoft/azure-vhd-utils/vhdcore/common", + "github.com/Microsoft/azure-vhd-utils/vhdcore/diskstream", + "github.com/Microsoft/azure-vhd-utils/vhdcore/footer", + "github.com/Microsoft/azure-vhd-utils/vhdcore/validator", "github.com/aliyun/alibaba-cloud-sdk-go/sdk", "github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors", "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests", diff --git a/cmd/climc/shell/updates.go b/cmd/climc/shell/updates.go new file mode 100644 index 0000000000..7e4879dac0 --- /dev/null +++ b/cmd/climc/shell/updates.go @@ -0,0 +1,47 @@ +package shell + +import ( + "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/mcclient/options" +) + +func init() { + type SUpdateListOptions struct { + options.BaseListOptions + Region string `help:"cloud region ID or Name"` + } + + R(&SUpdateListOptions{}, "update-list", "List updates", func(s *mcclient.ClientSession, args *SUpdateListOptions) error { + // TODO filer by region + result, err := modules.Updates.List(s, nil) + + if err != nil { + return err + } + + printList(result, modules.Updates.GetColumns(s)) + return nil + }) + + type SUpdatePerformOptions struct { + Cmp bool `help:"update all the compute nodes automatically"` + } + + R(&SUpdatePerformOptions{}, "update-perform", "Update the Controler", func(s *mcclient.ClientSession, args *SUpdatePerformOptions) error { + params := jsonutils.NewDict() + if args.Cmp { + params.Add(jsonutils.JSONTrue, "cmp") + } + + result, err := modules.Updates.List(s, nil) + + if err != nil { + return err + } + modules.Updates.DoUpdate(s, params) + printList(result, modules.Updates.GetColumns(s)) + return nil + }) +} diff --git a/pkg/mcclient/modules/managers.go b/pkg/mcclient/modules/managers.go index bc7e30dd93..3c1ef1b0df 100644 --- a/pkg/mcclient/modules/managers.go +++ b/pkg/mcclient/modules/managers.go @@ -122,4 +122,12 @@ func NewYunionConfManager(keyword, keywordPlural string, columns, adminColumns [ adminColumns: adminColumns, serviceType: "yunionconf"}, Keyword: keyword, KeywordPlural: keywordPlural} -} \ No newline at end of file +} + +func NewAutoUpdateManager(keyword, keywordPlural string, columns, adminColumns []string) ResourceManager { + return ResourceManager{ + BaseManager: BaseManager{columns: columns, + adminColumns: adminColumns, + serviceType: "autoupdate"}, + Keyword: keyword, KeywordPlural: keywordPlural} +} diff --git a/pkg/mcclient/modules/mod_updates.go b/pkg/mcclient/modules/mod_updates.go new file mode 100644 index 0000000000..1b9bb561e3 --- /dev/null +++ b/pkg/mcclient/modules/mod_updates.go @@ -0,0 +1,31 @@ +package modules + +import ( + "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/mcclient" +) + +type SUpdateManager struct { + ResourceManager +} + +var ( + Updates SUpdateManager +) + +func (this *SUpdateManager) DoUpdate(s *mcclient.ClientSession, params jsonutils.JSONObject) (jsonutils.JSONObject, error) { + ret := jsonutils.NewDict() + this.PerformAction(s, "", "", params) + return ret, nil +} + +func init() { + + Updates = SUpdateManager{NewAutoUpdateManager("update", "updates", + // user view + []string{"localVersion", "remoteVersion", "status", "updateAvailable"}, + []string{}, // admin view + )} + + register(&Updates) +} diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/.travis.yml b/vendor/github.com/360EntSecGroup-Skylar/excelize/.travis.yml index f4e5c0c802..c2f0f90590 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/.travis.yml +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/.travis.yml @@ -6,6 +6,17 @@ install: go: - 1.8.x - 1.9.x + - 1.10.x + - 1.11.x + +os: + - linux + - osx + +env: + matrix: + - GOARCH=amd64 + - GOARCH=386 script: - go vet ./... diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/CONTRIBUTING.md b/vendor/github.com/360EntSecGroup-Skylar/excelize/CONTRIBUTING.md index 27705c8145..5239a94704 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/CONTRIBUTING.md +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/CONTRIBUTING.md @@ -25,7 +25,6 @@ Security reports are greatly appreciated and we will publicly thank you for it. We currently do not offer a paid security bounty program, but are not ruling it out in the future. - ## Reporting other issues A great way to contribute to the project is to send a detailed report when you @@ -44,7 +43,7 @@ When reporting issues, always include the output of `go env`. Also include the steps required to reproduce the problem if possible and applicable. This information will help us review and fix your issue faster. -When sending lengthy log-files, consider posting them as a gist (https://gist.github.com). +When sending lengthy log-files, consider posting them as a gist [https://gist.github.com](https://gist.github.com). Don't forget to remove sensitive data from your logfiles before posting (you can replace those parts with "REDACTED"). @@ -77,9 +76,9 @@ However, there might be a way to implement that feature *on top of* excelize. Fork the repository and make changes on your fork in a feature branch: -- If it's a bug fix branch, name it XXXX-something where XXXX is the number of +* If it's a bug fix branch, name it XXXX-something where XXXX is the number of the issue. -- If it's a feature branch, create an enhancement issue to announce +* If it's a feature branch, create an enhancement issue to announce your intentions, and name it XXXX-something where XXXX is the number of the issue. @@ -194,7 +193,7 @@ signature certifies that you wrote the patch or otherwise have the right to pass it on as an open-source patch. The rules are pretty simple: if you can certify the below (from [developercertificate.org](http://developercertificate.org/)): -``` +```text Developer Certificate of Origin Version 1.1 @@ -242,14 +241,14 @@ Use your real name (sorry, no pseudonyms or anonymous contributions.) If you set your `user.name` and `user.email` git configs, you can sign your commit automatically with `git commit -s`. -### How can I become a maintainer? +### How can I become a maintainer First, all maintainers have 3 things -- They share responsibility in the project's success. -- They have made a long-term, recurring time investment to improve the project. -- They spend that time doing whatever needs to be done, not necessarily what -is the most interesting or fun. +* They share responsibility in the project's success. +* They have made a long-term, recurring time investment to improve the project. +* They spend that time doing whatever needs to be done, not necessarily what + is the most interesting or fun. Maintainers are often under-appreciated, because their work is harder to appreciate. It's easy to appreciate a really cool and technically advanced feature. It's harder diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/README.md b/vendor/github.com/360EntSecGroup-Skylar/excelize/README.md index d9c70df634..61ac2d6bee 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/README.md +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/README.md @@ -11,7 +11,7 @@ ## Introduction -Excelize is a library written in pure Golang and providing a set of functions that allow you to write to and read from XLSX files. Support reads and writes XLSX file generated by Microsoft Excel™ 2007 and later. Support save file without losing original charts of XLSX. This library needs Go version 1.8 or later. The full API docs can be seen using go's built-in documentation tool, or online at [godoc.org](https://godoc.org/github.com/360EntSecGroup-Skylar/excelize) and [Chinese translation](https://xuri.me/excelize/zh_cn). +Excelize is a library written in pure Go and providing a set of functions that allow you to write to and read from XLSX files. Support reads and writes XLSX file generated by Microsoft Excel™ 2007 and later. Support save file without losing original charts of XLSX. This library needs Go version 1.8 or later. The full API docs can be seen using go's built-in documentation tool, or online at [godoc.org](https://godoc.org/github.com/360EntSecGroup-Skylar/excelize) and [docs reference](https://xuri.me/excelize/). ## Basic Usage diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/README_zh.md b/vendor/github.com/360EntSecGroup-Skylar/excelize/README_zh.md index ef149b0876..49680d1c8c 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/README_zh.md +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/README_zh.md @@ -11,7 +11,7 @@ ## 简介 -Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的 XLSX 文档。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)、透视表和切片器等复杂样式的文档,还支持向 Excel 文档中插入图片与图表,并且在保存后不会丢失文档原有样式,可以应用于各类报表系统中。使用本类库要求使用的 Go 语言为 1.8 或更高版本,完整的 API 使用文档请访问 [godoc.org](https://godoc.org/github.com/360EntSecGroup-Skylar/excelize) 或查看 [中文翻译](https://xuri.me/excelize/zh_cn)。 +Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的 XLSX 文档。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)、透视表和切片器等复杂样式的文档,还支持向 Excel 文档中插入图片与图表,并且在保存后不会丢失文档原有样式,可以应用于各类报表系统中。使用本类库要求使用的 Go 语言为 1.8 或更高版本,完整的 API 使用文档请访问 [godoc.org](https://godoc.org/github.com/360EntSecGroup-Skylar/excelize) 或查看 [参考文档](https://xuri.me/excelize/)。 ## 快速上手 diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/cell.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/cell.go index c5cd8388e1..1277a18073 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/cell.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/cell.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -9,7 +18,18 @@ import ( "time" ) -// mergeCellsParser provides function to check merged cells in worksheet by +const ( + // STCellFormulaTypeArray defined the formula is an array formula. + STCellFormulaTypeArray = "array" + // STCellFormulaTypeDataTable defined the formula is a data table formula. + STCellFormulaTypeDataTable = "dataTable" + // STCellFormulaTypeNormal defined the formula is a regular cell formula. + STCellFormulaTypeNormal = "normal" + // STCellFormulaTypeShared defined the formula is part of a shared formula. + STCellFormulaTypeShared = "shared" +) + +// mergeCellsParser provides a function to check merged cells in worksheet by // given axis. func (f *File) mergeCellsParser(xlsx *xlsxWorksheet, axis string) string { axis = strings.ToUpper(axis) @@ -23,8 +43,8 @@ func (f *File) mergeCellsParser(xlsx *xlsxWorksheet, axis string) string { return axis } -// SetCellValue provides function to set value of a cell. The following shows -// the supported data types: +// SetCellValue provides a function to set value of a cell. The following +// shows the supported data types: // // int // int8 @@ -72,7 +92,7 @@ func (f *File) SetCellValue(sheet, axis string, value interface{}) { } } -// setCellIntValue provides function to set int value of a cell. +// setCellIntValue provides a function to set int value of a cell. func (f *File) setCellIntValue(sheet, axis string, value interface{}) { switch value.(type) { case int: @@ -100,7 +120,7 @@ func (f *File) setCellIntValue(sheet, axis string, value interface{}) { } } -// SetCellBool provides function to set bool type value of a cell by given +// SetCellBool provides a function to set bool type value of a cell by given // worksheet name, cell coordinates and cell value. func (f *File) SetCellBool(sheet, axis string, value bool) { xlsx := f.workSheetReader(sheet) @@ -128,10 +148,10 @@ func (f *File) SetCellBool(sheet, axis string, value bool) { } } -// GetCellValue provides function to get formatted value from cell by given -// worksheet name and axis in XLSX file. If it is possible to apply a format to -// the cell value, it will do so, if not then an error will be returned, along -// with the raw value of the cell. +// GetCellValue provides a function to get formatted value from cell by given +// worksheet name and axis in XLSX file. If it is possible to apply a format +// to the cell value, it will do so, if not then an error will be returned, +// along with the raw value of the cell. func (f *File) GetCellValue(sheet, axis string) string { xlsx := f.workSheetReader(sheet) axis = f.mergeCellsParser(xlsx, axis) @@ -163,9 +183,9 @@ func (f *File) GetCellValue(sheet, axis string) string { return "" } -// formattedValue provides function to returns a value after formatted. If it is -// possible to apply a format to the cell value, it will do so, if not then an -// error will be returned, along with the raw value of the cell. +// formattedValue provides a function to returns a value after formatted. If +// it is possible to apply a format to the cell value, it will do so, if not +// then an error will be returned, along with the raw value of the cell. func (f *File) formattedValue(s int, v string) string { if s == 0 { return v @@ -178,7 +198,7 @@ func (f *File) formattedValue(s int, v string) string { return v } -// GetCellStyle provides function to get cell style index by given worksheet +// GetCellStyle provides a function to get cell style index by given worksheet // name and cell coordinates. func (f *File) GetCellStyle(sheet, axis string) int { xlsx := f.workSheetReader(sheet) @@ -200,8 +220,8 @@ func (f *File) GetCellStyle(sheet, axis string) int { return f.prepareCellStyle(xlsx, cell, xlsx.SheetData.Row[xAxis].C[yAxis].S) } -// GetCellFormula provides function to get formula from cell by given worksheet -// name and axis in XLSX file. +// GetCellFormula provides a function to get formula from cell by given +// worksheet name and axis in XLSX file. func (f *File) GetCellFormula(sheet, axis string) string { xlsx := f.workSheetReader(sheet) axis = f.mergeCellsParser(xlsx, axis) @@ -224,6 +244,9 @@ func (f *File) GetCellFormula(sheet, axis string) string { if xlsx.SheetData.Row[k].R == row { for i := range xlsx.SheetData.Row[k].C { if axis == xlsx.SheetData.Row[k].C[i].R { + if xlsx.SheetData.Row[k].C[i].F.T == STCellFormulaTypeShared { + return getSharedForumula(xlsx, xlsx.SheetData.Row[k].C[i].F.Si) + } if xlsx.SheetData.Row[k].C[i].F != nil { return xlsx.SheetData.Row[k].C[i].F.Content } @@ -234,7 +257,35 @@ func (f *File) GetCellFormula(sheet, axis string) string { return "" } -// SetCellFormula provides function to set cell formula by given string and +// getSharedForumula find a cell contains the same formula as another cell, +// the "shared" value can be used for the t attribute and the si attribute can +// be used to refer to the cell containing the formula. Two formulas are +// considered to be the same when their respective representations in +// R1C1-reference notation, are the same. +// +// Note that this function not validate ref tag to check the cell if or not in +// allow area, and always return origin shared formula. +func getSharedForumula(xlsx *xlsxWorksheet, si string) string { + for k := range xlsx.SheetData.Row { + for i := range xlsx.SheetData.Row[k].C { + if xlsx.SheetData.Row[k].C[i].F == nil { + continue + } + if xlsx.SheetData.Row[k].C[i].F.T != STCellFormulaTypeShared { + continue + } + if xlsx.SheetData.Row[k].C[i].F.Si != si { + continue + } + if xlsx.SheetData.Row[k].C[i].F.Ref != "" { + return xlsx.SheetData.Row[k].C[i].F.Content + } + } + } + return "" +} + +// SetCellFormula provides a function to set cell formula by given string and // worksheet name. func (f *File) SetCellFormula(sheet, axis, formula string) { xlsx := f.workSheetReader(sheet) @@ -263,10 +314,10 @@ func (f *File) SetCellFormula(sheet, axis, formula string) { } } -// SetCellHyperLink provides function to set cell hyperlink by given worksheet -// name and link URL address. LinkType defines two types of hyperlink "External" -// for web site or "Location" for moving to one of cell in this workbook. The -// below is example for external link. +// SetCellHyperLink provides a function to set cell hyperlink by given +// worksheet name and link URL address. LinkType defines two types of +// hyperlink "External" for web site or "Location" for moving to one of cell +// in this workbook. The below is example for external link. // // xlsx.SetCellHyperLink("Sheet1", "A3", "https://github.com/360EntSecGroup-Skylar/excelize", "External") // // Set underline and font color style for the cell. @@ -299,10 +350,10 @@ func (f *File) SetCellHyperLink(sheet, axis, link, linkType string) { xlsx.Hyperlinks.Hyperlink = append(xlsx.Hyperlinks.Hyperlink, hyperlink) } -// GetCellHyperLink provides function to get cell hyperlink by given worksheet -// name and axis. Boolean type value link will be ture if the cell has a -// hyperlink and the target is the address of the hyperlink. Otherwise, the -// value of link will be false and the value of the target will be a blank +// GetCellHyperLink provides a function to get cell hyperlink by given +// worksheet name and axis. Boolean type value link will be ture if the cell +// has a hyperlink and the target is the address of the hyperlink. Otherwise, +// the value of link will be false and the value of the target will be a blank // string. For example get hyperlink of Sheet1!H6: // // link, target := xlsx.GetCellHyperLink("Sheet1", "H6") @@ -327,8 +378,8 @@ func (f *File) GetCellHyperLink(sheet, axis string) (bool, string) { return link, target } -// MergeCell provides function to merge cells by given coordinate area and sheet -// name. For example create a merged cell of D3:E9 on Sheet1: +// MergeCell provides a function to merge cells by given coordinate area and +// sheet name. For example create a merged cell of D3:E9 on Sheet1: // // xlsx.MergeCell("Sheet1", "D3", "E9") // @@ -387,7 +438,7 @@ func (f *File) MergeCell(sheet, hcell, vcell string) { } } -// SetCellInt provides function to set int type value of a cell by given +// SetCellInt provides a function to set int type value of a cell by given // worksheet name, cell coordinates and cell value. func (f *File) SetCellInt(sheet, axis string, value int) { xlsx := f.workSheetReader(sheet) @@ -411,7 +462,7 @@ func (f *File) SetCellInt(sheet, axis string, value int) { xlsx.SheetData.Row[xAxis].C[yAxis].V = strconv.Itoa(value) } -// prepareCellStyle provides function to prepare style index of cell in +// prepareCellStyle provides a function to prepare style index of cell in // worksheet by given column index and style index. func (f *File) prepareCellStyle(xlsx *xlsxWorksheet, col, style int) int { if xlsx.Cols != nil && style == 0 { @@ -424,8 +475,8 @@ func (f *File) prepareCellStyle(xlsx *xlsxWorksheet, col, style int) int { return style } -// SetCellStr provides function to set string type value of a cell. Total number -// of characters that a cell can contain 32767 characters. +// SetCellStr provides a function to set string type value of a cell. Total +// number of characters that a cell can contain 32767 characters. func (f *File) SetCellStr(sheet, axis, value string) { xlsx := f.workSheetReader(sheet) axis = f.mergeCellsParser(xlsx, axis) @@ -460,7 +511,7 @@ func (f *File) SetCellStr(sheet, axis, value string) { xlsx.SheetData.Row[xAxis].C[yAxis].V = value } -// SetCellDefault provides function to set string type value of a cell as +// SetCellDefault provides a function to set string type value of a cell as // default format without escaping the cell. func (f *File) SetCellDefault(sheet, axis, value string) { xlsx := f.workSheetReader(sheet) @@ -525,7 +576,7 @@ func (f *File) SetSheetRow(sheet, axis string, slice interface{}) { } } -// checkCellInArea provides function to determine if a given coordinate is +// checkCellInArea provides a function to determine if a given coordinate is // within an area. func checkCellInArea(cell, area string) bool { cell = strings.ToUpper(cell) diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/chart.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/chart.go index 7a14d09aec..5353a3297c 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/chart.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/chart.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -190,9 +199,9 @@ var ( } ) -// parseFormatChartSet provides function to parse the format settings of the +// parseFormatChartSet provides a function to parse the format settings of the // chart with default value. -func parseFormatChartSet(formatSet string) *formatChart { +func parseFormatChartSet(formatSet string) (*formatChart, error) { format := formatChart{ Dimension: formatChartDimension{ Width: 480, @@ -216,8 +225,8 @@ func parseFormatChartSet(formatSet string) *formatChart { }, ShowBlanksAs: "gap", } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddChart provides the method to add chart in a sheet by given chart format @@ -352,13 +361,18 @@ func parseFormatChartSet(formatSet string) *formatChart { // minimum // // reverse_order: Specifies that the categories or values on reverse order (orientation of the chart). The reverse_order property is optional. The default value is false. +// // maximum: Specifies that the fixed maximum, 0 is auto. The maximum property is optional. The default value is auto. +// // minimum: Specifies that the fixed minimum, 0 is auto. The minimum property is optional. The default value is auto. // // Set chart size by dimension property. The dimension property is optional. The default width is 480, and height is 290. // -func (f *File) AddChart(sheet, cell, format string) { - formatSet := parseFormatChartSet(format) +func (f *File) AddChart(sheet, cell, format string) error { + formatSet, err := parseFormatChartSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -371,9 +385,10 @@ func (f *File) AddChart(sheet, cell, format string) { f.addChart(formatSet) f.addContentTypePart(chartID, "chart") f.addContentTypePart(drawingID, "drawings") + return err } -// countCharts provides function to get chart files count storage in the +// countCharts provides a function to get chart files count storage in the // folder xl/charts. func (f *File) countCharts() int { count := 0 @@ -385,7 +400,7 @@ func (f *File) countCharts() int { return count } -// prepareDrawing provides function to prepare drawing ID and XML by given +// prepareDrawing provides a function to prepare drawing ID and XML by given // drawingID, worksheet name and default drawingXML. func (f *File) prepareDrawing(xlsx *xlsxWorksheet, drawingID int, sheet, drawingXML string) (int, string) { sheetRelationshipsDrawingXML := "../drawings/drawing" + strconv.Itoa(drawingID) + ".xml" @@ -402,8 +417,8 @@ func (f *File) prepareDrawing(xlsx *xlsxWorksheet, drawingID int, sheet, drawing return drawingID, drawingXML } -// addChart provides function to create chart as xl/charts/chart%d.xml by given -// format sets. +// addChart provides a function to create chart as xl/charts/chart%d.xml by +// given format sets. func (f *File) addChart(formatSet *formatChart) { count := f.countCharts() xlsxChartSpace := xlsxChartSpace{ @@ -558,7 +573,7 @@ func (f *File) addChart(formatSet *formatChart) { f.saveFileList(media, chart) } -// drawBaseChart provides function to draw the c:plotArea element for bar, +// drawBaseChart provides a function to draw the c:plotArea element for bar, // and column series charts by given format sets. func (f *File) drawBaseChart(formatSet *formatChart) *cPlotArea { c := cCharts{ @@ -655,7 +670,7 @@ func (f *File) drawBaseChart(formatSet *formatChart) *cPlotArea { return charts[formatSet.Type] } -// drawDoughnutChart provides function to draw the c:plotArea element for +// drawDoughnutChart provides a function to draw the c:plotArea element for // doughnut chart by given format sets. func (f *File) drawDoughnutChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ @@ -669,8 +684,8 @@ func (f *File) drawDoughnutChart(formatSet *formatChart) *cPlotArea { } } -// drawLineChart provides function to draw the c:plotArea element for line chart -// by given format sets. +// drawLineChart provides a function to draw the c:plotArea element for line +// chart by given format sets. func (f *File) drawLineChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ LineChart: &cCharts{ @@ -695,8 +710,8 @@ func (f *File) drawLineChart(formatSet *formatChart) *cPlotArea { } } -// drawPieChart provides function to draw the c:plotArea element for pie chart -// by given format sets. +// drawPieChart provides a function to draw the c:plotArea element for pie +// chart by given format sets. func (f *File) drawPieChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ PieChart: &cCharts{ @@ -708,8 +723,8 @@ func (f *File) drawPieChart(formatSet *formatChart) *cPlotArea { } } -// drawPie3DChart provides function to draw the c:plotArea element for 3D pie -// chart by given format sets. +// drawPie3DChart provides a function to draw the c:plotArea element for 3D +// pie chart by given format sets. func (f *File) drawPie3DChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ Pie3DChart: &cCharts{ @@ -721,7 +736,7 @@ func (f *File) drawPie3DChart(formatSet *formatChart) *cPlotArea { } } -// drawRadarChart provides function to draw the c:plotArea element for radar +// drawRadarChart provides a function to draw the c:plotArea element for radar // chart by given format sets. func (f *File) drawRadarChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ @@ -744,8 +759,8 @@ func (f *File) drawRadarChart(formatSet *formatChart) *cPlotArea { } } -// drawScatterChart provides function to draw the c:plotArea element for scatter -// chart by given format sets. +// drawScatterChart provides a function to draw the c:plotArea element for +// scatter chart by given format sets. func (f *File) drawScatterChart(formatSet *formatChart) *cPlotArea { return &cPlotArea{ ScatterChart: &cCharts{ @@ -767,8 +782,8 @@ func (f *File) drawScatterChart(formatSet *formatChart) *cPlotArea { } } -// drawChartSeries provides function to draw the c:ser element by given format -// sets. +// drawChartSeries provides a function to draw the c:ser element by given +// format sets. func (f *File) drawChartSeries(formatSet *formatChart) *[]cSer { ser := []cSer{} for k := range formatSet.Series { @@ -793,7 +808,7 @@ func (f *File) drawChartSeries(formatSet *formatChart) *[]cSer { return &ser } -// drawChartSeriesSpPr provides function to draw the c:spPr element by given +// drawChartSeriesSpPr provides a function to draw the c:spPr element by given // format sets. func (f *File) drawChartSeriesSpPr(i int, formatSet *formatChart) *cSpPr { spPrScatter := &cSpPr{ @@ -815,8 +830,8 @@ func (f *File) drawChartSeriesSpPr(i int, formatSet *formatChart) *cSpPr { return chartSeriesSpPr[formatSet.Type] } -// drawChartSeriesDPt provides function to draw the c:dPt element by given data -// index and format sets. +// drawChartSeriesDPt provides a function to draw the c:dPt element by given +// data index and format sets. func (f *File) drawChartSeriesDPt(i int, formatSet *formatChart) []*cDPt { dpt := []*cDPt{{ IDx: &attrValInt{Val: i}, @@ -844,8 +859,8 @@ func (f *File) drawChartSeriesDPt(i int, formatSet *formatChart) []*cDPt { return chartSeriesDPt[formatSet.Type] } -// drawChartSeriesCat provides function to draw the c:cat element by given chart -// series and format sets. +// drawChartSeriesCat provides a function to draw the c:cat element by given +// chart series and format sets. func (f *File) drawChartSeriesCat(v formatChartSeries, formatSet *formatChart) *cCat { cat := &cCat{ StrRef: &cStrRef{ @@ -856,8 +871,8 @@ func (f *File) drawChartSeriesCat(v formatChartSeries, formatSet *formatChart) * return chartSeriesCat[formatSet.Type] } -// drawChartSeriesVal provides function to draw the c:val element by given chart -// series and format sets. +// drawChartSeriesVal provides a function to draw the c:val element by given +// chart series and format sets. func (f *File) drawChartSeriesVal(v formatChartSeries, formatSet *formatChart) *cVal { val := &cVal{ NumRef: &cNumRef{ @@ -868,8 +883,8 @@ func (f *File) drawChartSeriesVal(v formatChartSeries, formatSet *formatChart) * return chartSeriesVal[formatSet.Type] } -// drawChartSeriesMarker provides function to draw the c:marker element by given -// data index and format sets. +// drawChartSeriesMarker provides a function to draw the c:marker element by +// given data index and format sets. func (f *File) drawChartSeriesMarker(i int, formatSet *formatChart) *cMarker { marker := &cMarker{ Symbol: &attrValString{Val: "circle"}, @@ -894,7 +909,7 @@ func (f *File) drawChartSeriesMarker(i int, formatSet *formatChart) *cMarker { return chartSeriesMarker[formatSet.Type] } -// drawChartSeriesXVal provides function to draw the c:xVal element by given +// drawChartSeriesXVal provides a function to draw the c:xVal element by given // chart series and format sets. func (f *File) drawChartSeriesXVal(v formatChartSeries, formatSet *formatChart) *cCat { cat := &cCat{ @@ -906,7 +921,7 @@ func (f *File) drawChartSeriesXVal(v formatChartSeries, formatSet *formatChart) return chartSeriesXVal[formatSet.Type] } -// drawChartSeriesYVal provides function to draw the c:yVal element by given +// drawChartSeriesYVal provides a function to draw the c:yVal element by given // chart series and format sets. func (f *File) drawChartSeriesYVal(v formatChartSeries, formatSet *formatChart) *cVal { val := &cVal{ @@ -918,8 +933,8 @@ func (f *File) drawChartSeriesYVal(v formatChartSeries, formatSet *formatChart) return chartSeriesYVal[formatSet.Type] } -// drawChartDLbls provides function to draw the c:dLbls element by given format -// sets. +// drawChartDLbls provides a function to draw the c:dLbls element by given +// format sets. func (f *File) drawChartDLbls(formatSet *formatChart) *cDLbls { return &cDLbls{ ShowLegendKey: &attrValBool{Val: formatSet.Legend.ShowLegendKey}, @@ -932,15 +947,15 @@ func (f *File) drawChartDLbls(formatSet *formatChart) *cDLbls { } } -// drawChartSeriesDLbls provides function to draw the c:dLbls element by given -// format sets. +// drawChartSeriesDLbls provides a function to draw the c:dLbls element by +// given format sets. func (f *File) drawChartSeriesDLbls(formatSet *formatChart) *cDLbls { dLbls := f.drawChartDLbls(formatSet) chartSeriesDLbls := map[string]*cDLbls{Bar: dLbls, BarStacked: dLbls, BarPercentStacked: dLbls, Bar3DClustered: dLbls, Bar3DStacked: dLbls, Bar3DPercentStacked: dLbls, Col: dLbls, ColStacked: dLbls, ColPercentStacked: dLbls, Col3DClustered: dLbls, Col3D: dLbls, Col3DStacked: dLbls, Col3DPercentStacked: dLbls, Doughnut: dLbls, Line: dLbls, Pie: dLbls, Pie3D: dLbls, Radar: dLbls, Scatter: nil} return chartSeriesDLbls[formatSet.Type] } -// drawPlotAreaCatAx provides function to draw the c:catAx element. +// drawPlotAreaCatAx provides a function to draw the c:catAx element. func (f *File) drawPlotAreaCatAx(formatSet *formatChart) []*cAxs { min := &attrValFloat{Val: formatSet.XAxis.Minimum} max := &attrValFloat{Val: formatSet.XAxis.Maximum} @@ -979,7 +994,7 @@ func (f *File) drawPlotAreaCatAx(formatSet *formatChart) []*cAxs { } } -// drawPlotAreaValAx provides function to draw the c:valAx element. +// drawPlotAreaValAx provides a function to draw the c:valAx element. func (f *File) drawPlotAreaValAx(formatSet *formatChart) []*cAxs { min := &attrValFloat{Val: formatSet.YAxis.Minimum} max := &attrValFloat{Val: formatSet.YAxis.Maximum} @@ -1015,7 +1030,7 @@ func (f *File) drawPlotAreaValAx(formatSet *formatChart) []*cAxs { } } -// drawPlotAreaSpPr provides function to draw the c:spPr element. +// drawPlotAreaSpPr provides a function to draw the c:spPr element. func (f *File) drawPlotAreaSpPr() *cSpPr { return &cSpPr{ Ln: &aLn{ @@ -1034,7 +1049,7 @@ func (f *File) drawPlotAreaSpPr() *cSpPr { } } -// drawPlotAreaTxPr provides function to draw the c:txPr element. +// drawPlotAreaTxPr provides a function to draw the c:txPr element. func (f *File) drawPlotAreaTxPr() *cTxPr { return &cTxPr{ BodyPr: aBodyPr{ @@ -1073,8 +1088,8 @@ func (f *File) drawPlotAreaTxPr() *cTxPr { } } -// drawingParser provides function to parse drawingXML. In order to solve the -// problem that the label structure is changed after serialization and +// drawingParser provides a function to parse drawingXML. In order to solve +// the problem that the label structure is changed after serialization and // deserialization, two different structures: decodeWsDr and encodeWsDr are // defined. func (f *File) drawingParser(drawingXML string, content *xlsxWsDr) int { @@ -1082,7 +1097,7 @@ func (f *File) drawingParser(drawingXML string, content *xlsxWsDr) int { _, ok := f.XLSX[drawingXML] if ok { // Append Model decodeWsDr := decodeWsDr{} - xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) + _ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) content.R = decodeWsDr.R cNvPrID = len(decodeWsDr.OneCellAnchor) + len(decodeWsDr.TwoCellAnchor) + 1 for _, v := range decodeWsDr.OneCellAnchor { @@ -1101,8 +1116,8 @@ func (f *File) drawingParser(drawingXML string, content *xlsxWsDr) int { return cNvPrID } -// addDrawingChart provides function to add chart graphic frame by given sheet, -// drawingXML, cell, width, height, relationship index and format sets. +// addDrawingChart provides a function to add chart graphic frame by given +// sheet, drawingXML, cell, width, height, relationship index and format sets. func (f *File) addDrawingChart(sheet, drawingXML, cell string, width, height, rID int, formatSet *formatPicture) { cell = strings.ToUpper(cell) fromCol := string(strings.Map(letterOnlyMapF, cell)) diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/col.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/col.go index 05ad0cceb8..32cda12a64 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/col.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/col.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -121,8 +130,8 @@ func (f *File) SetColOutlineLevel(sheet, column string, level uint8) { xlsx.Cols.Col = append(xlsx.Cols.Col, col) } -// SetColWidth provides function to set the width of a single column or multiple -// columns. For example: +// SetColWidth provides a function to set the width of a single column or +// multiple columns. For example: // // xlsx := excelize.NewFile() // xlsx.SetColWidth("Sheet1", "A", "H", 20) @@ -259,8 +268,8 @@ func (f *File) positionObjectPixels(sheet string, colStart, rowStart, x1, y1, wi return colStart, rowStart, xAbs, yAbs, colEnd, rowEnd, x2, y2 } -// getColWidth provides function to get column width in pixels by given sheet -// name and column index. +// getColWidth provides a function to get column width in pixels by given +// sheet name and column index. func (f *File) getColWidth(sheet string, col int) int { xlsx := f.workSheetReader(sheet) if xlsx.Cols != nil { @@ -278,8 +287,8 @@ func (f *File) getColWidth(sheet string, col int) int { return int(defaultColWidthPixels) } -// GetColWidth provides function to get column width by given worksheet name and -// column index. +// GetColWidth provides a function to get column width by given worksheet name +// and column index. func (f *File) GetColWidth(sheet, column string) float64 { col := TitleToNumber(strings.ToUpper(column)) + 1 xlsx := f.workSheetReader(sheet) @@ -298,8 +307,8 @@ func (f *File) GetColWidth(sheet, column string) float64 { return defaultColWidthPixels } -// InsertCol provides function to insert a new column before given column index. -// For example, create a new column before column C in Sheet1: +// InsertCol provides a function to insert a new column before given column +// index. For example, create a new column before column C in Sheet1: // // xlsx.InsertCol("Sheet1", "C") // @@ -308,8 +317,8 @@ func (f *File) InsertCol(sheet, column string) { f.adjustHelper(sheet, col, -1, 1) } -// RemoveCol provides function to remove single column by given worksheet name -// and column index. For example, remove column C in Sheet1: +// RemoveCol provides a function to remove single column by given worksheet +// name and column index. For example, remove column C in Sheet1: // // xlsx.RemoveCol("Sheet1", "C") // @@ -346,10 +355,10 @@ func completeCol(xlsx *xlsxWorksheet, row, cell int) { } } -// convertColWidthToPixels provieds function to convert the width of a cell from -// user's units to pixels. Excel rounds the column width to the nearest pixel. -// If the width hasn't been set by the user we use the default value. If the -// column is hidden it has a value of zero. +// convertColWidthToPixels provieds function to convert the width of a cell +// from user's units to pixels. Excel rounds the column width to the nearest +// pixel. If the width hasn't been set by the user we use the default value. +// If the column is hidden it has a value of zero. func convertColWidthToPixels(width float64) float64 { var padding float64 = 5 var pixels float64 diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/comment.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/comment.go index 41b4d6bae4..2bfd785da6 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/comment.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/comment.go @@ -1,21 +1,61 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( "encoding/json" "encoding/xml" + "fmt" "strconv" "strings" ) -// parseFormatCommentsSet provides function to parse the format settings of the -// comment with default value. -func parseFormatCommentsSet(formatSet string) *formatComment { +// parseFormatCommentsSet provides a function to parse the format settings of +// the comment with default value. +func parseFormatCommentsSet(formatSet string) (*formatComment, error) { format := formatComment{ Author: "Author:", Text: " ", } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err +} + +// GetComments retrieves all comments and returns a map of worksheet name to +// the worksheet comments. +func (f *File) GetComments() (comments map[string][]Comment) { + comments = map[string][]Comment{} + for n := range f.sheetMap { + commentID := f.GetSheetIndex(n) + commentsXML := "xl/comments" + strconv.Itoa(commentID) + ".xml" + c, ok := f.XLSX[commentsXML] + if ok { + d := xlsxComments{} + xml.Unmarshal([]byte(c), &d) + sheetComments := []Comment{} + for _, comment := range d.CommentList.Comment { + sheetComment := Comment{} + if comment.AuthorID < len(d.Authors) { + sheetComment.Author = d.Authors[comment.AuthorID].Author + } + sheetComment.Ref = comment.Ref + sheetComment.AuthorID = comment.AuthorID + for _, text := range comment.Text.R { + sheetComment.Text += text.T + } + sheetComments = append(sheetComments, sheetComment) + } + comments[n] = sheetComments + } + } + return } // AddComment provides the method to add comment in a sheet by given worksheet @@ -25,8 +65,11 @@ func parseFormatCommentsSet(formatSet string) *formatComment { // // xlsx.AddComment("Sheet1", "A30", `{"author":"Excelize: ","text":"This is a comment."}`) // -func (f *File) AddComment(sheet, cell, format string) { - formatSet := parseFormatCommentsSet(format) +func (f *File) AddComment(sheet, cell, format string) error { + formatSet, err := parseFormatCommentsSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) commentID := f.countComments() + 1 @@ -46,13 +89,23 @@ func (f *File) AddComment(sheet, cell, format string) { } commentsXML := "xl/comments" + strconv.Itoa(commentID) + ".xml" f.addComment(commentsXML, cell, formatSet) - f.addDrawingVML(commentID, drawingVML, cell) + var colCount int + for i, l := range strings.Split(formatSet.Text, "\n") { + if ll := len(l); ll > colCount { + if i == 0 { + ll += len(formatSet.Author) + } + colCount = ll + } + } + f.addDrawingVML(commentID, drawingVML, cell, strings.Count(formatSet.Text, "\n")+1, colCount) f.addContentTypePart(commentID, "comments") + return err } -// addDrawingVML provides function to create comment as +// addDrawingVML provides a function to create comment as // xl/drawings/vmlDrawing%d.vml by given commit ID and cell. -func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { +func (f *File) addDrawingVML(commentID int, drawingVML, cell string, lineCount, colCount int) { col := string(strings.Map(letterOnlyMapF, cell)) row, _ := strconv.Atoi(strings.Map(intOnlyMapF, cell)) xAxis := row - 1 @@ -79,7 +132,7 @@ func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { }, VPath: &vPath{ Gradientshapeok: "t", - Connecttype: "rect", + Connecttype: "miter", }, }, } @@ -109,10 +162,12 @@ func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { }, ClientData: &xClientData{ ObjectType: "Note", - Anchor: "3, 15, 8, 6, 4, 54, 13, 2", - AutoFill: "False", - Row: xAxis, - Column: yAxis, + Anchor: fmt.Sprintf( + "%d, 23, %d, 0, %d, %d, %d, 5", + 1+yAxis, 1+xAxis, 2+yAxis+lineCount, colCount+yAxis, 2+xAxis+lineCount), + AutoFill: "True", + Row: xAxis, + Column: yAxis, }, } s, _ := xml.Marshal(sp) @@ -127,7 +182,7 @@ func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { c, ok := f.XLSX[drawingVML] if ok { d := decodeVmlDrawing{} - xml.Unmarshal([]byte(c), &d) + _ = xml.Unmarshal([]byte(c), &d) for _, v := range d.Shape { s := xlsxShape{ ID: "_x0000_s1025", @@ -145,8 +200,8 @@ func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { f.XLSX[drawingVML] = v } -// addComment provides function to create chart as xl/comments%d.xml by given -// cell and format sets. +// addComment provides a function to create chart as xl/comments%d.xml by +// given cell and format sets. func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) { a := formatSet.Author t := formatSet.Text @@ -197,7 +252,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) { c, ok := f.XLSX[commentsXML] if ok { d := xlsxComments{} - xml.Unmarshal([]byte(c), &d) + _ = xml.Unmarshal([]byte(c), &d) comments.CommentList.Comment = append(comments.CommentList.Comment, d.CommentList.Comment...) } comments.CommentList.Comment = append(comments.CommentList.Comment, cmt) @@ -205,8 +260,8 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) { f.saveFileList(commentsXML, v) } -// countComments provides function to get comments files count storage in the -// folder xl. +// countComments provides a function to get comments files count storage in +// the folder xl. func (f *File) countComments() int { count := 0 for k := range f.XLSX { diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/date.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/date.go index a49386601c..45f3040cf5 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/date.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/date.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -8,17 +17,31 @@ import ( // timeLocationUTC defined the UTC time location. var timeLocationUTC, _ = time.LoadLocation("UTC") -// timeToUTCTime provides function to convert time to UTC time. +// timeToUTCTime provides a function to convert time to UTC time. func timeToUTCTime(t time.Time) time.Time { return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), timeLocationUTC) } -// timeToExcelTime provides function to convert time to Excel time. +// timeToExcelTime provides a function to convert time to Excel time. func timeToExcelTime(t time.Time) float64 { - return float64(t.UnixNano())/8.64e13 + 25569.0 + // TODO in future this should probably also handle date1904 and like TimeFromExcelTime + var excelTime float64 + var deltaDays int64 + excelTime = 0 + deltaDays = 290 * 364 + // check if UnixNano would be out of int64 range + for t.Unix() > deltaDays*24*60*60 { + // reduce by aprox. 290 years, which is max for int64 nanoseconds + delta := time.Duration(deltaDays) * 24 * time.Hour + excelTime = excelTime + float64(deltaDays) + t = t.Add(-delta) + } + // finally add remainder of UnixNano to keep nano precision + // and 25569 which is days between 1900 and 1970 + return excelTime + float64(t.UnixNano())/8.64e13 + 25569.0 } -// shiftJulianToNoon provides function to process julian date to noon. +// shiftJulianToNoon provides a function to process julian date to noon. func shiftJulianToNoon(julianDays, julianFraction float64) (float64, float64) { switch { case -0.5 < julianFraction && julianFraction < 0.5: @@ -33,7 +56,7 @@ func shiftJulianToNoon(julianDays, julianFraction float64) (float64, float64) { return julianDays, julianFraction } -// fractionOfADay provides function to return the integer values for hour, +// fractionOfADay provides a function to return the integer values for hour, // minutes, seconds and nanoseconds that comprised a given fraction of a day. // values would round to 1 us. func fractionOfADay(fraction float64) (hours, minutes, seconds, nanoseconds int) { @@ -54,7 +77,7 @@ func fractionOfADay(fraction float64) (hours, minutes, seconds, nanoseconds int) return } -// julianDateToGregorianTime provides function to convert julian date to +// julianDateToGregorianTime provides a function to convert julian date to // gregorian time. func julianDateToGregorianTime(part1, part2 float64) time.Time { part1I, part1F := math.Modf(part1) @@ -67,12 +90,12 @@ func julianDateToGregorianTime(part1, part2 float64) time.Time { return time.Date(year, time.Month(month), day, hours, minutes, seconds, nanoseconds, time.UTC) } -// By this point generations of programmers have repeated the algorithm sent to -// the editor of "Communications of the ACM" in 1968 (published in CACM, volume -// 11, number 10, October 1968, p.657). None of those programmers seems to have -// found it necessary to explain the constants or variable names set out by -// Henry F. Fliegel and Thomas C. Van Flandern. Maybe one day I'll buy that -// jounal and expand an explanation here - that day is not today. +// By this point generations of programmers have repeated the algorithm sent +// to the editor of "Communications of the ACM" in 1968 (published in CACM, +// volume 11, number 10, October 1968, p.657). None of those programmers seems +// to have found it necessary to explain the constants or variable names set +// out by Henry F. Fliegel and Thomas C. Van Flandern. Maybe one day I'll buy +// that jounal and expand an explanation here - that day is not today. func doTheFliegelAndVanFlandernAlgorithm(jd int) (day, month, year int) { l := jd + 68569 n := (4 * l) / 146097 @@ -87,9 +110,10 @@ func doTheFliegelAndVanFlandernAlgorithm(jd int) (day, month, year int) { return d, m, y } -// timeFromExcelTime provides function to convert an excelTime representation -// (stored as a floating point number) to a time.Time. +// timeFromExcelTime provides a function to convert an excelTime +// representation (stored as a floating point number) to a time.Time. func timeFromExcelTime(excelTime float64, date1904 bool) time.Time { + const MDD int64 = 106750 // Max time.Duration Days, aprox. 290 years var date time.Time var intPart = int64(excelTime) // Excel uses Julian dates prior to March 1st 1900, and Gregorian @@ -113,6 +137,13 @@ func timeFromExcelTime(excelTime float64, date1904 bool) time.Time { } else { date = time.Date(1899, 12, 30, 0, 0, 0, 0, time.UTC) } + + // Duration is limited to aprox. 290 years + for intPart > MDD { + durationDays := time.Duration(MDD) * time.Hour * 24 + date = date.Add(durationDays) + intPart = intPart - MDD + } durationDays := time.Duration(intPart) * time.Hour * 24 durationPart := time.Duration(dayNanoSeconds * floatPart) return date.Add(durationDays).Add(durationPart) diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.go index f2e50c8d7c..d1f0b7f1c1 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.go @@ -1,3 +1,13 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. +// +// See https://xuri.me/excelize for more information about this package. package excelize import ( @@ -21,6 +31,7 @@ type File struct { Sheet map[string]*xlsxWorksheet SheetCount int Styles *xlsxStyleSheet + Theme *xlsxTheme WorkBook *xlsxWorkbook WorkBookRels *xlsxWorkbookRels XLSX map[string][]byte @@ -66,10 +77,11 @@ func OpenReader(r io.Reader) (*File, error) { } f.sheetMap = f.getSheetMap() f.Styles = f.stylesReader() + f.Theme = f.themeReader() return f, nil } -// setDefaultTimeStyle provides function to set default numbers format for +// setDefaultTimeStyle provides a function to set default numbers format for // time.Time type cell value by given worksheet name, cell coordinates and // number format code. func (f *File) setDefaultTimeStyle(sheet, axis string, format int) { @@ -79,8 +91,8 @@ func (f *File) setDefaultTimeStyle(sheet, axis string, format int) { } } -// workSheetReader provides function to get the pointer to the structure after -// deserialization by given worksheet name. +// workSheetReader provides a function to get the pointer to the structure +// after deserialization by given worksheet name. func (f *File) workSheetReader(sheet string) *xlsxWorksheet { name, ok := f.sheetMap[trimSheetName(sheet)] if !ok { @@ -88,7 +100,7 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet { } if f.Sheet[name] == nil { var xlsx xlsxWorksheet - xml.Unmarshal(f.readXML(name), &xlsx) + _ = xml.Unmarshal(f.readXML(name), &xlsx) if f.checked == nil { f.checked = make(map[string]bool) } @@ -103,7 +115,7 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet { return f.Sheet[name] } -// checkSheet provides function to fill each row element and make that is +// checkSheet provides a function to fill each row element and make that is // continuous in a worksheet of XML. func checkSheet(xlsx *xlsxWorksheet) { row := len(xlsx.SheetData.Row) @@ -131,7 +143,7 @@ func checkSheet(xlsx *xlsxWorksheet) { xlsx.SheetData = sheetData } -// replaceWorkSheetsRelationshipsNameSpaceBytes provides function to replace +// replaceWorkSheetsRelationshipsNameSpaceBytes provides a function to replace // xl/worksheets/sheet%d.xml XML tags to self-closing for compatible Microsoft // Office Excel 2007. func replaceWorkSheetsRelationshipsNameSpaceBytes(workbookMarshal []byte) []byte { @@ -180,7 +192,7 @@ func (f *File) UpdateLinkedValue() { } } -// adjustHelper provides function to adjust rows and columns dimensions, +// adjustHelper provides a function to adjust rows and columns dimensions, // hyperlinks, merged cells and auto filter when inserting or deleting rows or // columns. // @@ -202,7 +214,7 @@ func (f *File) adjustHelper(sheet string, column, row, offset int) { checkRow(xlsx) } -// adjustColDimensions provides function to update column dimensions when +// adjustColDimensions provides a function to update column dimensions when // inserting or deleting rows or columns. func (f *File) adjustColDimensions(xlsx *xlsxWorksheet, column, offset int) { for i, r := range xlsx.SheetData.Row { @@ -218,8 +230,8 @@ func (f *File) adjustColDimensions(xlsx *xlsxWorksheet, column, offset int) { } } -// adjustRowDimensions provides function to update row dimensions when inserting -// or deleting rows or columns. +// adjustRowDimensions provides a function to update row dimensions when +// inserting or deleting rows or columns. func (f *File) adjustRowDimensions(xlsx *xlsxWorksheet, rowIndex, offset int) { if rowIndex == -1 { return @@ -238,7 +250,7 @@ func (f *File) adjustRowDimensions(xlsx *xlsxWorksheet, rowIndex, offset int) { } } -// adjustHyperlinks provides function to update hyperlinks when inserting or +// adjustHyperlinks provides a function to update hyperlinks when inserting or // deleting rows or columns. func (f *File) adjustHyperlinks(sheet string, column, rowIndex, offset int) { xlsx := f.workSheetReader(sheet) @@ -278,8 +290,8 @@ func (f *File) adjustHyperlinks(sheet string, column, rowIndex, offset int) { } } -// adjustMergeCellsHelper provides function to update merged cells when inserting or -// deleting rows or columns. +// adjustMergeCellsHelper provides a function to update merged cells when +// inserting or deleting rows or columns. func (f *File) adjustMergeCellsHelper(xlsx *xlsxWorksheet, column, rowIndex, offset int) { if xlsx.MergeCells != nil { for k, v := range xlsx.MergeCells.Cells { @@ -319,8 +331,8 @@ func (f *File) adjustMergeCellsHelper(xlsx *xlsxWorksheet, column, rowIndex, off } } -// adjustMergeCells provides function to update merged cells when inserting or -// deleting rows or columns. +// adjustMergeCells provides a function to update merged cells when inserting +// or deleting rows or columns. func (f *File) adjustMergeCells(xlsx *xlsxWorksheet, column, rowIndex, offset int) { f.adjustMergeCellsHelper(xlsx, column, rowIndex, offset) @@ -340,8 +352,8 @@ func (f *File) adjustMergeCells(xlsx *xlsxWorksheet, column, rowIndex, offset in } } -// adjustAutoFilter provides function to update the auto filter when inserting -// or deleting rows or columns. +// adjustAutoFilter provides a function to update the auto filter when +// inserting or deleting rows or columns. func (f *File) adjustAutoFilter(xlsx *xlsxWorksheet, column, rowIndex, offset int) { f.adjustAutoFilterHelper(xlsx, column, rowIndex, offset) @@ -374,7 +386,7 @@ func (f *File) adjustAutoFilter(xlsx *xlsxWorksheet, column, rowIndex, offset in } } -// adjustAutoFilterHelper provides function to update the auto filter when +// adjustAutoFilterHelper provides a function to update the auto filter when // inserting or deleting rows or columns. func (f *File) adjustAutoFilterHelper(xlsx *xlsxWorksheet, column, rowIndex, offset int) { if xlsx.AutoFilter != nil { diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.png b/vendor/github.com/360EntSecGroup-Skylar/excelize/excelize.png index b4b452944ca9942a9f3d75a685c40ccab89744de..9f220b514f2d14eb9a5a39c833468b13c64621d6 100644 GIT binary patch literal 54188 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 CXyn5H diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/file.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/file.go index 36af6f8811..5bfed392f6 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/file.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/file.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -8,7 +17,7 @@ import ( "os" ) -// NewFile provides function to create new file by default template. For +// NewFile provides a function to create new file by default template. For // example: // // xlsx := NewFile() @@ -36,19 +45,20 @@ func NewFile() *File { f.WorkBookRels = f.workbookRelsReader() f.Sheet["xl/worksheets/sheet1.xml"] = f.workSheetReader("Sheet1") f.sheetMap["Sheet1"] = "xl/worksheets/sheet1.xml" + f.Theme = f.themeReader() return f } -// Save provides function to override the xlsx file with origin path. +// Save provides a function to override the xlsx file with origin path. func (f *File) Save() error { if f.Path == "" { - return fmt.Errorf("No path defined for file, consider File.WriteTo or File.Write") + return fmt.Errorf("no path defined for file, consider File.WriteTo or File.Write") } return f.SaveAs(f.Path) } -// SaveAs provides function to create or update to an xlsx file at the provided -// path. +// SaveAs provides a function to create or update to an xlsx file at the +// provided path. func (f *File) SaveAs(name string) error { file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666) if err != nil { @@ -58,8 +68,14 @@ func (f *File) SaveAs(name string) error { return f.Write(file) } -// Write provides function to write to an io.Writer. +// Write provides a function to write to an io.Writer. func (f *File) Write(w io.Writer) error { + _, err := f.WriteTo(w) + return err +} + +// WriteTo implements io.WriterTo to write the file. +func (f *File) WriteTo(w io.Writer) (int64, error) { buf := new(bytes.Buffer) zw := zip.NewWriter(buf) f.contentTypesWriter() @@ -70,21 +86,17 @@ func (f *File) Write(w io.Writer) error { for path, content := range f.XLSX { fi, err := zw.Create(path) if err != nil { - return err + return 0, err } - _, err = fi.Write([]byte(content)) + _, err = fi.Write(content) if err != nil { - return err + return 0, err } } err := zw.Close() if err != nil { - return err + return 0, err } - if _, err := buf.WriteTo(w); err != nil { - return err - } - - return nil + return buf.WriteTo(w) } diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/lib.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/lib.go index a1687810ba..865ee29657 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/lib.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/lib.go @@ -1,9 +1,17 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( "archive/zip" "bytes" - "encoding/gob" "io" "log" "math" @@ -26,7 +34,7 @@ func ReadZipReader(r *zip.Reader) (map[string][]byte, int, error) { return fileList, worksheets, nil } -// readXML provides function to read XML content as string. +// readXML provides a function to read XML content as string. func (f *File) readXML(name string) []byte { if content, ok := f.XLSX[name]; ok { return content @@ -34,8 +42,8 @@ func (f *File) readXML(name string) []byte { return []byte{} } -// saveFileList provides function to update given file content in file list of -// XLSX. +// saveFileList provides a function to update given file content in file list +// of XLSX. func (f *File) saveFileList(name string, content []byte) { newContent := make([]byte, 0, len(XMLHeader)+len(content)) newContent = append(newContent, []byte(XMLHeader)...) @@ -50,12 +58,12 @@ func readFile(file *zip.File) []byte { log.Fatal(err) } buff := bytes.NewBuffer(nil) - io.Copy(buff, rc) + _, _ = io.Copy(buff, rc) rc.Close() return buff.Bytes() } -// ToAlphaString provides function to convert integer to Excel sheet column +// ToAlphaString provides a function to convert integer to Excel sheet column // title. For example convert 36 to column title AK: // // excelize.ToAlphaString(36) @@ -73,9 +81,9 @@ func ToAlphaString(value int) string { return ans } -// TitleToNumber provides function to convert Excel sheet column title to int -// (this function doesn't do value check currently). For example convert AK -// and ak to column title 36: +// TitleToNumber provides a function to convert Excel sheet column title to +// int (this function doesn't do value check currently). For example convert +// AK and ak to column title 36: // // excelize.TitleToNumber("AK") // excelize.TitleToNumber("ak") @@ -115,17 +123,6 @@ func intOnlyMapF(rune rune) rune { return -1 } -// deepCopy provides method to creates a deep copy of whatever is passed to it -// and returns the copy in an interface. The returned value will need to be -// asserted to the correct type. -func deepCopy(dst, src interface{}) error { - var buf bytes.Buffer - if err := gob.NewEncoder(&buf).Encode(src); err != nil { - return err - } - return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst) -} - // boolPtr returns a pointer to a bool with the given value. func boolPtr(b bool) *bool { return &b } @@ -137,8 +134,8 @@ func defaultTrue(b *bool) bool { return *b } -// axisLowerOrEqualThan returns true if axis1 <= axis2 -// axis1/axis2 can be either a column or a row axis, e.g. "A", "AAE", "42", "1", etc. +// axisLowerOrEqualThan returns true if axis1 <= axis2 axis1/axis2 can be +// either a column or a row axis, e.g. "A", "AAE", "42", "1", etc. // // For instance, the following comparisons are all true: // @@ -159,7 +156,8 @@ func axisLowerOrEqualThan(axis1, axis2 string) bool { } } -// getCellColRow returns the two parts of a cell identifier (its col and row) as strings +// getCellColRow returns the two parts of a cell identifier (its col and row) +// as strings // // For instance: // @@ -176,3 +174,12 @@ func getCellColRow(cell string) (col, row string) { return cell, "" } + +// parseFormatSet provides a method to convert format string to []byte and +// handle empty string. +func parseFormatSet(formatSet string) []byte { + if formatSet != "" { + return []byte(formatSet) + } + return []byte("{}") +} diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/picture.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/picture.go index 6c84cddb3b..8785aaf53f 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/picture.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/picture.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -14,9 +23,9 @@ import ( "strings" ) -// parseFormatPictureSet provides function to parse the format settings of the -// picture with default value. -func parseFormatPictureSet(formatSet string) *formatPicture { +// parseFormatPictureSet provides a function to parse the format settings of +// the picture with default value. +func parseFormatPictureSet(formatSet string) (*formatPicture, error) { format := formatPicture{ FPrintsWithSheet: true, FLocksWithSheet: false, @@ -26,8 +35,8 @@ func parseFormatPictureSet(formatSet string) *formatPicture { XScale: 1.0, YScale: 1.0, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal(parseFormatSet(formatSet), &format) + return &format, err } // AddPicture provides the method to add picture in a sheet by given picture @@ -78,20 +87,66 @@ func parseFormatPictureSet(formatSet string) *formatPicture { // positioning is move and size with cells. func (f *File) AddPicture(sheet, cell, picture, format string) error { var err error - var drawingHyperlinkRID int - var hyperlinkType string // Check picture exists first. if _, err = os.Stat(picture); os.IsNotExist(err) { return err } ext, ok := supportImageTypes[path.Ext(picture)] if !ok { - return errors.New("Unsupported image extension") + return errors.New("unsupported image extension") + } + file, _ := ioutil.ReadFile(picture) + _, name := filepath.Split(picture) + return f.AddPictureFromBytes(sheet, cell, format, name, ext, file) +} + +// AddPictureFromBytes provides the method to add picture in a sheet by given +// picture format set (such as offset, scale, aspect ratio setting and print +// settings), file base name, extension name and file bytes. For example: +// +// package main +// +// import ( +// "fmt" +// _ "image/jpeg" +// "io/ioutil" +// +// "github.com/360EntSecGroup-Skylar/excelize" +// ) +// +// func main() { +// xlsx := excelize.NewFile() +// +// file, err := ioutil.ReadFile("./image1.jpg") +// if err != nil { +// fmt.Println(err) +// } +// err = xlsx.AddPictureFromBytes("Sheet1", "A2", "", "Excel Logo", ".jpg", file) +// if err != nil { +// fmt.Println(err) +// } +// err = xlsx.SaveAs("./Book1.xlsx") +// if err != nil { +// fmt.Println(err) +// } +// } +// +func (f *File) AddPictureFromBytes(sheet, cell, format, name, extension string, file []byte) error { + var err error + var drawingHyperlinkRID int + var hyperlinkType string + ext, ok := supportImageTypes[extension] + if !ok { + return errors.New("unsupported image extension") + } + formatSet, err := parseFormatPictureSet(format) + if err != nil { + return err + } + image, _, err := image.DecodeConfig(bytes.NewReader(file)) + if err != nil { + return err } - readFile, _ := os.Open(picture) - image, _, err := image.DecodeConfig(readFile) - _, file := filepath.Split(picture) - formatSet := parseFormatPictureSet(format) // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -107,13 +162,13 @@ func (f *File) AddPicture(sheet, cell, picture, format string) error { } drawingHyperlinkRID = f.addDrawingRelationships(drawingID, SourceRelationshipHyperLink, formatSet.Hyperlink, hyperlinkType) } - f.addDrawingPicture(sheet, drawingXML, cell, file, image.Width, image.Height, drawingRID, drawingHyperlinkRID, formatSet) - f.addMedia(picture, ext) + f.addDrawingPicture(sheet, drawingXML, cell, name, image.Width, image.Height, drawingRID, drawingHyperlinkRID, formatSet) + f.addMedia(file, ext) f.addContentTypePart(drawingID, "drawings") return err } -// addSheetRelationships provides function to add +// addSheetRelationships provides a function to add // xl/worksheets/_rels/sheet%d.xml.rels by given worksheet name, relationship // type and target. func (f *File) addSheetRelationships(sheet, relType, target, targetMode string) int { @@ -130,7 +185,7 @@ func (f *File) addSheetRelationships(sheet, relType, target, targetMode string) _, ok = f.XLSX[rels] if ok { ID.Reset() - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) rID = len(sheetRels.Relationships) + 1 ID.WriteString("rId") ID.WriteString(strconv.Itoa(rID)) @@ -146,9 +201,9 @@ func (f *File) addSheetRelationships(sheet, relType, target, targetMode string) return rID } -// deleteSheetRelationships provides function to delete relationships in -// xl/worksheets/_rels/sheet%d.xml.rels by given worksheet name and relationship -// index. +// deleteSheetRelationships provides a function to delete relationships in +// xl/worksheets/_rels/sheet%d.xml.rels by given worksheet name and +// relationship index. func (f *File) deleteSheetRelationships(sheet, rID string) { name, ok := f.sheetMap[trimSheetName(sheet)] if !ok { @@ -156,7 +211,7 @@ func (f *File) deleteSheetRelationships(sheet, rID string) { } var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels" var sheetRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) for k, v := range sheetRels.Relationships { if v.ID == rID { sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...) @@ -166,7 +221,7 @@ func (f *File) deleteSheetRelationships(sheet, rID string) { f.saveFileList(rels, output) } -// addSheetLegacyDrawing provides function to add legacy drawing element to +// addSheetLegacyDrawing provides a function to add legacy drawing element to // xl/worksheets/sheet%d.xml by given worksheet name and relationship index. func (f *File) addSheetLegacyDrawing(sheet string, rID int) { xlsx := f.workSheetReader(sheet) @@ -175,7 +230,7 @@ func (f *File) addSheetLegacyDrawing(sheet string, rID int) { } } -// addSheetDrawing provides function to add drawing element to +// addSheetDrawing provides a function to add drawing element to // xl/worksheets/sheet%d.xml by given worksheet name and relationship index. func (f *File) addSheetDrawing(sheet string, rID int) { xlsx := f.workSheetReader(sheet) @@ -184,7 +239,7 @@ func (f *File) addSheetDrawing(sheet string, rID int) { } } -// addSheetPicture provides function to add picture element to +// addSheetPicture provides a function to add picture element to // xl/worksheets/sheet%d.xml by given worksheet name and relationship index. func (f *File) addSheetPicture(sheet string, rID int) { xlsx := f.workSheetReader(sheet) @@ -193,7 +248,7 @@ func (f *File) addSheetPicture(sheet string, rID int) { } } -// countDrawings provides function to get drawing files count storage in the +// countDrawings provides a function to get drawing files count storage in the // folder xl/drawings. func (f *File) countDrawings() int { count := 0 @@ -205,7 +260,7 @@ func (f *File) countDrawings() int { return count } -// addDrawingPicture provides function to add picture by given sheet, +// addDrawingPicture provides a function to add picture by given sheet, // drawingXML, cell, file name, width, height relationship index and format // sets. func (f *File) addDrawingPicture(sheet, drawingXML, cell, file string, width, height, rID, hyperlinkRID int, formatSet *formatPicture) { @@ -260,8 +315,8 @@ func (f *File) addDrawingPicture(sheet, drawingXML, cell, file string, width, he f.saveFileList(drawingXML, output) } -// addDrawingRelationships provides function to add image part relationships in -// the file xl/drawings/_rels/drawing%d.xml.rels by given drawing index, +// addDrawingRelationships provides a function to add image part relationships +// in the file xl/drawings/_rels/drawing%d.xml.rels by given drawing index, // relationship type and target. func (f *File) addDrawingRelationships(index int, relType, target, targetMode string) int { var rels = "xl/drawings/_rels/drawing" + strconv.Itoa(index) + ".xml.rels" @@ -273,7 +328,7 @@ func (f *File) addDrawingRelationships(index int, relType, target, targetMode st _, ok := f.XLSX[rels] if ok { ID.Reset() - xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) rID = len(drawingRels.Relationships) + 1 ID.WriteString("rId") ID.WriteString(strconv.Itoa(rID)) @@ -289,8 +344,8 @@ func (f *File) addDrawingRelationships(index int, relType, target, targetMode st return rID } -// countMedia provides function to get media files count storage in the folder -// xl/media/image. +// countMedia provides a function to get media files count storage in the +// folder xl/media/image. func (f *File) countMedia() int { count := 0 for k := range f.XLSX { @@ -301,17 +356,16 @@ func (f *File) countMedia() int { return count } -// addMedia provides function to add picture into folder xl/media/image by given -// file name and extension name. -func (f *File) addMedia(file, ext string) { +// addMedia provides a function to add picture into folder xl/media/image by +// given file and extension name. +func (f *File) addMedia(file []byte, ext string) { count := f.countMedia() - dat, _ := ioutil.ReadFile(file) media := "xl/media/image" + strconv.Itoa(count+1) + ext - f.XLSX[media] = dat + f.XLSX[media] = file } -// setContentTypePartImageExtensions provides function to set the content type -// for relationship parts and the Main Document part. +// setContentTypePartImageExtensions provides a function to set the content +// type for relationship parts and the Main Document part. func (f *File) setContentTypePartImageExtensions() { var imageTypes = map[string]bool{"jpeg": false, "png": false, "gif": false} content := f.contentTypesReader() @@ -331,7 +385,7 @@ func (f *File) setContentTypePartImageExtensions() { } } -// setContentTypePartVMLExtensions provides function to set the content type +// setContentTypePartVMLExtensions provides a function to set the content type // for relationship parts and the Main Document part. func (f *File) setContentTypePartVMLExtensions() { vml := false @@ -349,8 +403,8 @@ func (f *File) setContentTypePartVMLExtensions() { } } -// addContentTypePart provides function to add content type part relationships -// in the file [Content_Types].xml by given index. +// addContentTypePart provides a function to add content type part +// relationships in the file [Content_Types].xml by given index. func (f *File) addContentTypePart(index int, contentType string) { setContentType := map[string]func(){ "comments": f.setContentTypePartVMLExtensions, @@ -384,7 +438,7 @@ func (f *File) addContentTypePart(index int, contentType string) { }) } -// getSheetRelationshipsTargetByID provides function to get Target attribute +// getSheetRelationshipsTargetByID provides a function to get Target attribute // value in xl/worksheets/_rels/sheet%d.xml.rels by given worksheet name and // relationship index. func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string { @@ -394,7 +448,7 @@ func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string { } var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels" var sheetRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) for _, v := range sheetRels.Relationships { if v.ID == rID { return v.Target @@ -403,9 +457,9 @@ func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string { return "" } -// GetPicture provides function to get picture base name and raw content embed -// in XLSX by given worksheet and cell name. This function returns the file name -// in XLSX and file contents as []byte data types. For example: +// GetPicture provides a function to get picture base name and raw content +// embed in XLSX by given worksheet and cell name. This function returns the +// file name in XLSX and file contents as []byte data types. For example: // // xlsx, err := excelize.OpenFile("./Book1.xlsx") // if err != nil { @@ -431,10 +485,10 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { _, ok := f.XLSX[drawingXML] if !ok { - return "", []byte{} + return "", nil } decodeWsDr := decodeWsDr{} - xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) + _ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) cell = strings.ToUpper(cell) fromCol := string(strings.Map(letterOnlyMapF, cell)) @@ -446,7 +500,7 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { for _, anchor := range decodeWsDr.TwoCellAnchor { decodeTwoCellAnchor := decodeTwoCellAnchor{} - xml.Unmarshal([]byte(""+anchor.Content+""), &decodeTwoCellAnchor) + _ = xml.Unmarshal([]byte(""+anchor.Content+""), &decodeTwoCellAnchor) if decodeTwoCellAnchor.From != nil && decodeTwoCellAnchor.Pic != nil { if decodeTwoCellAnchor.From.Col == col && decodeTwoCellAnchor.From.Row == row { xlsxWorkbookRelation := f.getDrawingRelationships(drawingRelationships, decodeTwoCellAnchor.Pic.BlipFill.Blip.Embed) @@ -460,15 +514,16 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { return "", []byte{} } -// getDrawingRelationships provides function to get drawing relationships from -// xl/drawings/_rels/drawing%s.xml.rels by given file name and relationship ID. +// getDrawingRelationships provides a function to get drawing relationships +// from xl/drawings/_rels/drawing%s.xml.rels by given file name and +// relationship ID. func (f *File) getDrawingRelationships(rels, rID string) *xlsxWorkbookRelation { _, ok := f.XLSX[rels] if !ok { return nil } var drawingRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) for _, v := range drawingRels.Relationships { if v.ID == rID { return &v diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/rows.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/rows.go index 75fa7f64b2..5c384c8f09 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/rows.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/rows.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -31,7 +40,7 @@ func (f *File) GetRows(sheet string) [][]string { output, _ := xml.Marshal(f.Sheet[name]) f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpaceBytes(output)) } - decoder := xml.NewDecoder(bytes.NewReader(f.readXML(name))) + xml.NewDecoder(bytes.NewReader(f.readXML(name))) d := f.sharedStringsReader() var inElement string var r xlsxRow @@ -44,7 +53,7 @@ func (f *File) GetRows(sheet string) [][]string { } rows = append(rows, row) } - decoder = xml.NewDecoder(bytes.NewReader(f.readXML(name))) + decoder := xml.NewDecoder(bytes.NewReader(f.readXML(name))) for { token, _ := decoder.Token() if token == nil { @@ -55,7 +64,7 @@ func (f *File) GetRows(sheet string) [][]string { inElement = startElement.Name.Local if inElement == "row" { r = xlsxRow{} - decoder.DecodeElement(&r, &startElement) + _ = decoder.DecodeElement(&r, &startElement) cr := r.R - 1 for _, colCell := range r.C { c := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) @@ -110,9 +119,9 @@ func (rows *Rows) Columns() []string { } startElement := rows.token.(xml.StartElement) r := xlsxRow{} - rows.decoder.DecodeElement(&r, &startElement) + _ = rows.decoder.DecodeElement(&r, &startElement) d := rows.f.sharedStringsReader() - row := make([]string, len(r.C), len(r.C)) + row := make([]string, len(r.C)) for _, colCell := range r.C { c := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) val, _ := colCell.getValueFrom(rows.f, d) @@ -132,7 +141,7 @@ func (err ErrSheetNotExist) Error() string { // Rows return a rows iterator. For example: // -// rows, err := xlsx.GetRows("Sheet1") +// rows, err := xlsx.Rows("Sheet1") // for rows.Next() { // for _, colCell := range rows.Columns() { // fmt.Print(colCell, "\t") @@ -173,7 +182,7 @@ func (f *File) getTotalRowsCols(name string) (int, int) { inElement = startElement.Name.Local if inElement == "row" { r = xlsxRow{} - decoder.DecodeElement(&r, &startElement) + _ = decoder.DecodeElement(&r, &startElement) tr = r.R for _, colCell := range r.C { col := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) @@ -202,7 +211,7 @@ func (f *File) SetRowHeight(sheet string, row int, height float64) { xlsx.SheetData.Row[rowIdx].CustomHeight = true } -// getRowHeight provides function to get row height in pixels by given sheet +// getRowHeight provides a function to get row height in pixels by given sheet // name and row index. func (f *File) getRowHeight(sheet string, row int) int { xlsx := f.workSheetReader(sheet) @@ -215,7 +224,7 @@ func (f *File) getRowHeight(sheet string, row int) int { return int(defaultRowHeightPixels) } -// GetRowHeight provides function to get row height by given worksheet name +// GetRowHeight provides a function to get row height by given worksheet name // and row index. For example, get the height of the first row in Sheet1: // // xlsx.GetRowHeight("Sheet1", 1) @@ -231,7 +240,7 @@ func (f *File) GetRowHeight(sheet string, row int) float64 { return defaultRowHeightPixels } -// sharedStringsReader provides function to get the pointer to the structure +// sharedStringsReader provides a function to get the pointer to the structure // after deserialization of xl/sharedStrings.xml. func (f *File) sharedStringsReader() *xlsxSST { if f.SharedStrings == nil { @@ -240,14 +249,15 @@ func (f *File) sharedStringsReader() *xlsxSST { if len(ss) == 0 { ss = f.readXML("xl/SharedStrings.xml") } - xml.Unmarshal([]byte(ss), &sharedStrings) + _ = xml.Unmarshal([]byte(ss), &sharedStrings) f.SharedStrings = &sharedStrings } return f.SharedStrings } -// getValueFrom return a value from a column/row cell, this function is inteded -// to be used with for range on rows an argument with the xlsx opened file. +// getValueFrom return a value from a column/row cell, this function is +// inteded to be used with for range on rows an argument with the xlsx opened +// file. func (xlsx *xlsxC) getValueFrom(f *File, d *xlsxSST) (string, error) { switch xlsx.T { case "s": @@ -315,9 +325,9 @@ func (f *File) SetRowOutlineLevel(sheet string, rowIndex int, level uint8) { xlsx.SheetData.Row[rowIndex].OutlineLevel = level } -// GetRowOutlineLevel provides a function to get outline level number of a single row by given -// worksheet name and row index. For example, get outline number of row 2 in -// Sheet1: +// GetRowOutlineLevel provides a function to get outline level number of a +// single row by given worksheet name and row index. For example, get outline +// number of row 2 in Sheet1: // // xlsx.GetRowOutlineLevel("Sheet1", 2) // @@ -329,8 +339,8 @@ func (f *File) GetRowOutlineLevel(sheet string, rowIndex int) uint8 { return xlsx.SheetData.Row[rowIndex].OutlineLevel } -// RemoveRow provides function to remove single row by given worksheet name and -// row index. For example, remove row 3 in Sheet1: +// RemoveRow provides a function to remove single row by given worksheet name +// and row index. For example, remove row 3 in Sheet1: // // xlsx.RemoveRow("Sheet1", 2) // @@ -349,8 +359,8 @@ func (f *File) RemoveRow(sheet string, row int) { } } -// InsertRow provides function to insert a new row before given row index. For -// example, create a new row before row 3 in Sheet1: +// InsertRow provides a function to insert a new row before given row index. +// For example, create a new row before row 3 in Sheet1: // // xlsx.InsertRow("Sheet1", 2) // @@ -362,8 +372,8 @@ func (f *File) InsertRow(sheet string, row int) { f.adjustHelper(sheet, -1, row, 1) } -// checkRow provides function to check and fill each column element for all rows -// and make that is continuous in a worksheet of XML. For example: +// checkRow provides a function to check and fill each column element for all +// rows and make that is continuous in a worksheet of XML. For example: // // // @@ -416,7 +426,7 @@ func checkRow(xlsx *xlsxWorksheet) { } } -// completeRow provides function to check and fill each column element for a +// completeRow provides a function to check and fill each column element for a // single row and make that is continuous in a worksheet of XML by given row // index and axis. func completeRow(xlsx *xlsxWorksheet, row, cell int) { @@ -448,9 +458,9 @@ func completeRow(xlsx *xlsxWorksheet, row, cell int) { } } -// convertRowHeightToPixels provides function to convert the height of a cell -// from user's units to pixels. If the height hasn't been set by the user we use -// the default value. If the row is hidden it has a value of zero. +// convertRowHeightToPixels provides a function to convert the height of a +// cell from user's units to pixels. If the height hasn't been set by the user +// we use the default value. If the row is hidden it has a value of zero. func convertRowHeightToPixels(height float64) float64 { var pixels float64 if height == 0 { diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/shape.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/shape.go index 0b937521cc..ad87712e82 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/shape.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/shape.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -7,9 +16,9 @@ import ( "strings" ) -// parseFormatShapeSet provides function to parse the format settings of the +// parseFormatShapeSet provides a function to parse the format settings of the // shape with default value. -func parseFormatShapeSet(formatSet string) *formatShape { +func parseFormatShapeSet(formatSet string) (*formatShape, error) { format := formatShape{ Width: 160, Height: 160, @@ -23,14 +32,14 @@ func parseFormatShapeSet(formatSet string) *formatShape { YScale: 1.0, }, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddShape provides the method to add shape in a sheet by given worksheet // index, shape format set (such as offset, scale, aspect ratio setting and -// print settings) and properties set. For example, add text box (rect shape) in -// Sheet1: +// print settings) and properties set. For example, add text box (rect shape) +// in Sheet1: // // xlsx.AddShape("Sheet1", "G6", `{"type":"rect","color":{"line":"#4286F4","fill":"#8eb9ff"},"paragraph":[{"text":"Rectangle Shape","font":{"bold":true,"italic":true,"family":"Berlin Sans FB Demi","size":36,"color":"#777777","underline":"sng"}}],"width":180,"height": 90}`) // @@ -245,8 +254,11 @@ func parseFormatShapeSet(formatSet string) *formatShape { // wavyHeavy // wavyDbl // -func (f *File) AddShape(sheet, cell, format string) { - formatSet := parseFormatShapeSet(format) +func (f *File) AddShape(sheet, cell, format string) error { + formatSet, err := parseFormatShapeSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first shape for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -266,9 +278,10 @@ func (f *File) AddShape(sheet, cell, format string) { } f.addDrawingShape(sheet, drawingXML, cell, formatSet) f.addContentTypePart(drawingID, "drawings") + return err } -// addDrawingShape provides function to add preset geometry by given sheet, +// addDrawingShape provides a function to add preset geometry by given sheet, // drawingXMLand format sets. func (f *File) addDrawingShape(sheet, drawingXML, cell string, formatSet *formatShape) { textUnderlineType := map[string]bool{"none": true, "words": true, "sng": true, "dbl": true, "heavy": true, "dotted": true, "dottedHeavy": true, "dash": true, "dashHeavy": true, "dashLong": true, "dashLongHeavy": true, "dotDash": true, "dotDashHeavy": true, "dotDotDash": true, "dotDotDashHeavy": true, "wavy": true, "wavyHeavy": true, "wavyDbl": true} @@ -393,7 +406,7 @@ func (f *File) addDrawingShape(sheet, drawingXML, cell string, formatSet *format f.saveFileList(drawingXML, output) } -// setShapeRef provides function to set color with hex model by given actual +// setShapeRef provides a function to set color with hex model by given actual // color value. func setShapeRef(color string, i int) *aRef { if color == "" { diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheet.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheet.go index cb50d6103f..b615ae5e14 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheet.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheet.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -5,14 +14,17 @@ import ( "encoding/json" "encoding/xml" "errors" + "io/ioutil" "os" "path" "strconv" "strings" "unicode/utf8" + + "github.com/mohae/deepcopy" ) -// NewSheet provides function to create a new sheet by given worksheet name, +// NewSheet provides a function to create a new sheet by given worksheet name, // when creating a new XLSX file, the default sheet will be create, when you // create a new file. func (f *File) NewSheet(name string) int { @@ -34,18 +46,18 @@ func (f *File) NewSheet(name string) int { return f.SheetCount } -// contentTypesReader provides function to get the pointer to the +// contentTypesReader provides a function to get the pointer to the // [Content_Types].xml structure after deserialization. func (f *File) contentTypesReader() *xlsxTypes { if f.ContentTypes == nil { var content xlsxTypes - xml.Unmarshal([]byte(f.readXML("[Content_Types].xml")), &content) + _ = xml.Unmarshal([]byte(f.readXML("[Content_Types].xml")), &content) f.ContentTypes = &content } return f.ContentTypes } -// contentTypesWriter provides function to save [Content_Types].xml after +// contentTypesWriter provides a function to save [Content_Types].xml after // serialize structure. func (f *File) contentTypesWriter() { if f.ContentTypes != nil { @@ -54,18 +66,18 @@ func (f *File) contentTypesWriter() { } } -// workbookReader provides function to get the pointer to the xl/workbook.xml +// workbookReader provides a function to get the pointer to the xl/workbook.xml // structure after deserialization. func (f *File) workbookReader() *xlsxWorkbook { if f.WorkBook == nil { var content xlsxWorkbook - xml.Unmarshal([]byte(f.readXML("xl/workbook.xml")), &content) + _ = xml.Unmarshal([]byte(f.readXML("xl/workbook.xml")), &content) f.WorkBook = &content } return f.WorkBook } -// workbookWriter provides function to save xl/workbook.xml after serialize +// workbookWriter provides a function to save xl/workbook.xml after serialize // structure. func (f *File) workbookWriter() { if f.WorkBook != nil { @@ -74,7 +86,7 @@ func (f *File) workbookWriter() { } } -// worksheetWriter provides function to save xl/worksheets/sheet%d.xml after +// worksheetWriter provides a function to save xl/worksheets/sheet%d.xml after // serialize structure. func (f *File) worksheetWriter() { for path, sheet := range f.Sheet { @@ -92,15 +104,17 @@ func (f *File) worksheetWriter() { } } -// trimCell provides function to trim blank cells which created by completeCol. +// trimCell provides a function to trim blank cells which created by completeCol. func trimCell(column []xlsxC) []xlsxC { - col := []xlsxC{} + col := make([]xlsxC, len(column)) + i := 0 for _, c := range column { if c.S != 0 || c.V != "" || c.F != nil || c.T != "" { - col = append(col, c) + col[i] = c + i++ } } - return col + return col[0:i] } // Read and update property of contents type of XLSX. @@ -128,25 +142,33 @@ func (f *File) setSheet(index int, name string) { // allowed in sheet title. func (f *File) setWorkbook(name string, rid int) { content := f.workbookReader() + rID := 0 + for _, v := range content.Sheets.Sheet { + t, _ := strconv.Atoi(v.SheetID) + if t > rID { + rID = t + } + } + rID++ content.Sheets.Sheet = append(content.Sheets.Sheet, xlsxSheet{ Name: trimSheetName(name), - SheetID: strconv.Itoa(rid), + SheetID: strconv.Itoa(rID), ID: "rId" + strconv.Itoa(rid), }) } -// workbookRelsReader provides function to read and unmarshal workbook +// workbookRelsReader provides a function to read and unmarshal workbook // relationships of XLSX file. func (f *File) workbookRelsReader() *xlsxWorkbookRels { if f.WorkBookRels == nil { var content xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML("xl/_rels/workbook.xml.rels")), &content) + _ = xml.Unmarshal([]byte(f.readXML("xl/_rels/workbook.xml.rels")), &content) f.WorkBookRels = &content } return f.WorkBookRels } -// workbookRelsWriter provides function to save xl/_rels/workbook.xml.rels after +// workbookRelsWriter provides a function to save xl/_rels/workbook.xml.rels after // serialize structure. func (f *File) workbookRelsWriter() { if f.WorkBookRels != nil { @@ -193,19 +215,13 @@ func (f *File) setAppXML() { // library doesn't multiple namespace declarations in a single element of a // document. This function is a horrible hack to fix that after the XML // marshalling is completed. -func replaceRelationshipsNameSpace(workbookMarshal string) string { - oldXmlns := `` - newXmlns := `` - return strings.Replace(workbookMarshal, oldXmlns, newXmlns, -1) -} - func replaceRelationshipsNameSpaceBytes(workbookMarshal []byte) []byte { oldXmlns := []byte(``) newXmlns := []byte(``) return bytes.Replace(workbookMarshal, oldXmlns, newXmlns, -1) } -// SetActiveSheet provides function to set default active worksheet of XLSX by +// SetActiveSheet provides a function to set default active worksheet of XLSX by // given index. Note that active index is different with the index that got by // function GetSheetMap, and it should be greater than 0 and less than total // worksheet numbers. @@ -241,7 +257,7 @@ func (f *File) SetActiveSheet(index int) { } } -// GetActiveSheetIndex provides function to get active sheet of XLSX. If not +// GetActiveSheetIndex provides a function to get active sheet of XLSX. If not // found the active sheet will be return integer 0. func (f *File) GetActiveSheetIndex() int { buffer := bytes.Buffer{} @@ -251,7 +267,7 @@ func (f *File) GetActiveSheetIndex() int { buffer.WriteString("xl/worksheets/sheet") buffer.WriteString(strings.TrimPrefix(v.ID, "rId")) buffer.WriteString(".xml") - xml.Unmarshal([]byte(f.readXML(buffer.String())), &xlsx) + _ = xml.Unmarshal([]byte(f.readXML(buffer.String())), &xlsx) for _, sheetView := range xlsx.SheetViews.SheetView { if sheetView.TabSelected { ID, _ := strconv.Atoi(strings.TrimPrefix(v.ID, "rId")) @@ -263,7 +279,7 @@ func (f *File) GetActiveSheetIndex() int { return 0 } -// SetSheetName provides function to set the worksheet name be given old and new +// SetSheetName provides a function to set the worksheet name be given old and new // worksheet name. Maximum 31 characters are allowed in sheet title and this // function only changes the name of the sheet and will not update the sheet // name in the formula or reference associated with the cell. So there may be @@ -281,7 +297,7 @@ func (f *File) SetSheetName(oldName, newName string) { } } -// GetSheetName provides function to get worksheet name of XLSX by given +// GetSheetName provides a function to get worksheet name of XLSX by given // worksheet index. If given sheet index is invalid, will return an empty // string. func (f *File) GetSheetName(index int) string { @@ -300,7 +316,7 @@ func (f *File) GetSheetName(index int) string { return "" } -// GetSheetIndex provides function to get worksheet index of XLSX by given sheet +// GetSheetIndex provides a function to get worksheet index of XLSX by given sheet // name. If given worksheet name is invalid, will return an integer type value // 0. func (f *File) GetSheetIndex(name string) int { @@ -319,7 +335,7 @@ func (f *File) GetSheetIndex(name string) int { return 0 } -// GetSheetMap provides function to get worksheet name and index map of XLSX. +// GetSheetMap provides a function to get worksheet name and index map of XLSX. // For example: // // xlsx, err := excelize.OpenFile("./Book1.xlsx") @@ -345,7 +361,7 @@ func (f *File) GetSheetMap() map[int]string { return sheetMap } -// getSheetMap provides function to get worksheet name and XML file path map of +// getSheetMap provides a function to get worksheet name and XML file path map of // XLSX. func (f *File) getSheetMap() map[string]string { maps := make(map[string]string) @@ -355,8 +371,8 @@ func (f *File) getSheetMap() map[string]string { return maps } -// SetSheetBackground provides function to set background picture by given -// worksheet name. +// SetSheetBackground provides a function to set background picture by given +// worksheet name and file path. func (f *File) SetSheetBackground(sheet, picture string) error { var err error // Check picture exists first. @@ -365,17 +381,18 @@ func (f *File) SetSheetBackground(sheet, picture string) error { } ext, ok := supportImageTypes[path.Ext(picture)] if !ok { - return errors.New("Unsupported image extension") + return errors.New("unsupported image extension") } pictureID := f.countMedia() + 1 rID := f.addSheetRelationships(sheet, SourceRelationshipImage, "../media/image"+strconv.Itoa(pictureID)+ext, "") f.addSheetPicture(sheet, rID) - f.addMedia(picture, ext) + file, _ := ioutil.ReadFile(picture) + f.addMedia(file, ext) f.setContentTypePartImageExtensions() return err } -// DeleteSheet provides function to delete worksheet in a workbook by given +// DeleteSheet provides a function to delete worksheet in a workbook by given // worksheet name. Use this method with caution, which will affect changes in // references such as formulas, charts, and so on. If there is any referenced // value of the deleted worksheet, it will cause a file error when you open it. @@ -399,7 +416,7 @@ func (f *File) DeleteSheet(name string) { f.SetActiveSheet(len(f.GetSheetMap())) } -// deleteSheetFromWorkbookRels provides function to remove worksheet +// deleteSheetFromWorkbookRels provides a function to remove worksheet // relationships by given relationships ID in the file // xl/_rels/workbook.xml.rels. func (f *File) deleteSheetFromWorkbookRels(rID string) string { @@ -413,7 +430,7 @@ func (f *File) deleteSheetFromWorkbookRels(rID string) string { return "" } -// deleteSheetFromContentTypes provides function to remove worksheet +// deleteSheetFromContentTypes provides a function to remove worksheet // relationships by given target name in the file [Content_Types].xml. func (f *File) deleteSheetFromContentTypes(target string) { content := f.contentTypesReader() @@ -424,7 +441,7 @@ func (f *File) deleteSheetFromContentTypes(target string) { } } -// CopySheet provides function to duplicate a worksheet by gave source and +// CopySheet provides a function to duplicate a worksheet by gave source and // target worksheet index. Note that currently doesn't support duplicate // workbooks that contain tables, charts or pictures. For Example: // @@ -435,18 +452,17 @@ func (f *File) deleteSheetFromContentTypes(target string) { // func (f *File) CopySheet(from, to int) error { if from < 1 || to < 1 || from == to || f.GetSheetName(from) == "" || f.GetSheetName(to) == "" { - return errors.New("Invalid worksheet index") + return errors.New("invalid worksheet index") } f.copySheet(from, to) return nil } -// copySheet provides function to duplicate a worksheet by gave source and +// copySheet provides a function to duplicate a worksheet by gave source and // target worksheet name. func (f *File) copySheet(from, to int) { sheet := f.workSheetReader("sheet" + strconv.Itoa(from)) - worksheet := xlsxWorksheet{} - deepCopy(&worksheet, &sheet) + worksheet := deepcopy.Copy(sheet).(*xlsxWorksheet) path := "xl/worksheets/sheet" + strconv.Itoa(to) + ".xml" if len(worksheet.SheetViews.SheetView) > 0 { worksheet.SheetViews.SheetView[0].TabSelected = false @@ -454,7 +470,7 @@ func (f *File) copySheet(from, to int) { worksheet.Drawing = nil worksheet.TableParts = nil worksheet.PageSetUp = nil - f.Sheet[path] = &worksheet + f.Sheet[path] = worksheet toRels := "xl/worksheets/_rels/sheet" + strconv.Itoa(to) + ".xml.rels" fromRels := "xl/worksheets/_rels/sheet" + strconv.Itoa(from) + ".xml.rels" _, ok := f.XLSX[fromRels] @@ -463,7 +479,7 @@ func (f *File) copySheet(from, to int) { } } -// SetSheetVisible provides function to set worksheet visible by given worksheet +// SetSheetVisible provides a function to set worksheet visible by given worksheet // name. A workbook must contain at least one visible worksheet. If the given // worksheet has been activated, this setting will be invalidated. Sheet state // values as defined by http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.sheetstatevalues.aspx @@ -505,14 +521,14 @@ func (f *File) SetSheetVisible(name string, visible bool) { } } -// parseFormatPanesSet provides function to parse the panes settings. -func parseFormatPanesSet(formatSet string) *formatPanes { +// parseFormatPanesSet provides a function to parse the panes settings. +func parseFormatPanesSet(formatSet string) (*formatPanes, error) { format := formatPanes{} - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } -// SetPanes provides function to create and remove freeze panes and split panes +// SetPanes provides a function to create and remove freeze panes and split panes // by given worksheet name and panes format set. // // activePane defines the pane that is active. The possible values for this @@ -598,7 +614,7 @@ func parseFormatPanesSet(formatSet string) *formatPanes { // xlsx.SetPanes("Sheet1", `{"freeze":false,"split":false}`) // func (f *File) SetPanes(sheet, panes string) { - fs := parseFormatPanesSet(panes) + fs, _ := parseFormatPanesSet(panes) xlsx := f.workSheetReader(sheet) p := &xlsxPane{ ActivePane: fs.ActivePane, @@ -626,7 +642,7 @@ func (f *File) SetPanes(sheet, panes string) { xlsx.SheetViews.SheetView[len(xlsx.SheetViews.SheetView)-1].Selection = s } -// GetSheetVisible provides function to get worksheet visible by given worksheet +// GetSheetVisible provides a function to get worksheet visible by given worksheet // name. For example, get visible state of Sheet1: // // xlsx.GetSheetVisible("Sheet1") @@ -644,11 +660,19 @@ func (f *File) GetSheetVisible(name string) bool { return visible } -// trimSheetName provides function to trim invaild characters by given worksheet +// trimSheetName provides a function to trim invaild characters by given worksheet // name. func trimSheetName(name string) string { - r := strings.NewReplacer(":", "", "\\", "", "/", "", "?", "", "*", "", "[", "", "]", "") - name = r.Replace(name) + r := []rune{} + for _, v := range name { + switch v { + case 58, 92, 47, 63, 42, 91, 93: // replace :\/?*[] + continue + default: + r = append(r, v) + } + } + name = string(r) if utf8.RuneCountInString(name) > 31 { name = string([]rune(name)[0:31]) } diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetpr.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetpr.go index 7b8df54837..e38b64e25c 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetpr.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetpr.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize // SheetPrOption is an option of a view of a worksheet. See SetSheetPrOptions(). @@ -98,7 +107,7 @@ func (o *AutoPageBreaks) getSheetPrOption(pr *xlsxSheetPr) { *o = AutoPageBreaks(pr.PageSetUpPr.AutoPageBreaks) } -// SetSheetPrOptions provides function to sets worksheet properties. +// SetSheetPrOptions provides a function to sets worksheet properties. // // Available options: // CodeName(string) @@ -120,7 +129,7 @@ func (f *File) SetSheetPrOptions(name string, opts ...SheetPrOption) error { return nil } -// GetSheetPrOptions provides function to gets worksheet properties. +// GetSheetPrOptions provides a function to gets worksheet properties. // // Available options: // CodeName(string) diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetview.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetview.go index 679e915391..e76325c558 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetview.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/sheetview.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "fmt" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/styles.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/styles.go index daa344772f..513fc9b3a9 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/styles.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/styles.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -10,8 +19,8 @@ import ( ) // Excel styles can reference number formats that are built-in, all of which -// have an id less than 164. This is a possibly incomplete list comprised of as -// many of them as I could find. +// have an id less than 164. This is a possibly incomplete list comprised of +// as many of them as I could find. var builtInNumFmt = map[int]string{ 0: "general", 1: "0", @@ -798,45 +807,46 @@ var validType = map[string]string{ // criteriaType defined the list of valid criteria types. var criteriaType = map[string]string{ - "between": "between", - "not between": "notBetween", - "equal to": "equal", - "=": "equal", - "==": "equal", - "not equal to": "notEqual", - "!=": "notEqual", - "<>": "notEqual", - "greater than": "greaterThan", - ">": "greaterThan", - "less than": "lessThan", - "<": "lessThan", + "between": "between", + "not between": "notBetween", + "equal to": "equal", + "=": "equal", + "==": "equal", + "not equal to": "notEqual", + "!=": "notEqual", + "<>": "notEqual", + "greater than": "greaterThan", + ">": "greaterThan", + "less than": "lessThan", + "<": "lessThan", "greater than or equal to": "greaterThanOrEqual", - ">=": "greaterThanOrEqual", - "less than or equal to": "lessThanOrEqual", - "<=": "lessThanOrEqual", - "containing": "containsText", - "not containing": "notContains", - "begins with": "beginsWith", - "ends with": "endsWith", - "yesterday": "yesterday", - "today": "today", - "last 7 days": "last7Days", - "last week": "lastWeek", - "this week": "thisWeek", - "continue week": "continueWeek", - "last month": "lastMonth", - "this month": "thisMonth", - "continue month": "continueMonth", + ">=": "greaterThanOrEqual", + "less than or equal to": "lessThanOrEqual", + "<=": "lessThanOrEqual", + "containing": "containsText", + "not containing": "notContains", + "begins with": "beginsWith", + "ends with": "endsWith", + "yesterday": "yesterday", + "today": "today", + "last 7 days": "last7Days", + "last week": "lastWeek", + "this week": "thisWeek", + "continue week": "continueWeek", + "last month": "lastMonth", + "this month": "thisMonth", + "continue month": "continueMonth", } -// formatToString provides function to return original string by given built-in -// number formats code and cell string. +// formatToString provides a function to return original string by given +// built-in number formats code and cell string. func formatToString(i int, v string) string { return v } -// formatToInt provides function to convert original string to integer format as -// string type by given built-in number formats code and cell string. +// formatToInt provides a function to convert original string to integer +// format as string type by given built-in number formats code and cell +// string. func formatToInt(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -845,8 +855,9 @@ func formatToInt(i int, v string) string { return fmt.Sprintf("%d", int(f)) } -// formatToFloat provides function to convert original string to float format as -// string type by given built-in number formats code and cell string. +// formatToFloat provides a function to convert original string to float +// format as string type by given built-in number formats code and cell +// string. func formatToFloat(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -855,8 +866,8 @@ func formatToFloat(i int, v string) string { return fmt.Sprintf("%.2f", f) } -// formatToA provides function to convert original string to special format as -// string type by given built-in number formats code and cell string. +// formatToA provides a function to convert original string to special format +// as string type by given built-in number formats code and cell string. func formatToA(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -870,8 +881,8 @@ func formatToA(i int, v string) string { return fmt.Sprintf("%d", t) } -// formatToB provides function to convert original string to special format as -// string type by given built-in number formats code and cell string. +// formatToB provides a function to convert original string to special format +// as string type by given built-in number formats code and cell string. func formatToB(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -883,8 +894,8 @@ func formatToB(i int, v string) string { return fmt.Sprintf("%.2f", f) } -// formatToC provides function to convert original string to special format as -// string type by given built-in number formats code and cell string. +// formatToC provides a function to convert original string to special format +// as string type by given built-in number formats code and cell string. func formatToC(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -894,8 +905,8 @@ func formatToC(i int, v string) string { return fmt.Sprintf("%d%%", int(f)) } -// formatToD provides function to convert original string to special format as -// string type by given built-in number formats code and cell string. +// formatToD provides a function to convert original string to special format +// as string type by given built-in number formats code and cell string. func formatToD(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -905,8 +916,8 @@ func formatToD(i int, v string) string { return fmt.Sprintf("%.2f%%", f) } -// formatToE provides function to convert original string to special format as -// string type by given built-in number formats code and cell string. +// formatToE provides a function to convert original string to special format +// as string type by given built-in number formats code and cell string. func formatToE(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -915,17 +926,17 @@ func formatToE(i int, v string) string { return fmt.Sprintf("%.e", f) } -// parseTime provides function to returns a string parsed using time.Time. +// parseTime provides a function to returns a string parsed using time.Time. // Replace Excel placeholders with Go time placeholders. For example, replace -// yyyy with 2006. These are in a specific order, due to the fact that m is used -// in month, minute, and am/pm. It would be easier to fix that with regular -// expressions, but if it's possible to keep this simple it would be easier to -// maintain. Full-length month and days (e.g. March, Tuesday) have letters in -// them that would be replaced by other characters below (such as the 'h' in -// March, or the 'd' in Tuesday) below. First we convert them to arbitrary -// characters unused in Excel Date formats, and then at the end, turn them to -// what they should actually be. -// Based off: http://www.ozgrid.com/Excel/CustomFormats.htm +// yyyy with 2006. These are in a specific order, due to the fact that m is +// used in month, minute, and am/pm. It would be easier to fix that with +// regular expressions, but if it's possible to keep this simple it would be +// easier to maintain. Full-length month and days (e.g. March, Tuesday) have +// letters in them that would be replaced by other characters below (such as +// the 'h' in March, or the 'd' in Tuesday) below. First we convert them to +// arbitrary characters unused in Excel Date formats, and then at the end, +// turn them to what they should actually be. Based off: +// http://www.ozgrid.com/Excel/CustomFormats.htm func parseTime(i int, v string) string { f, err := strconv.ParseFloat(v, 64) if err != nil { @@ -983,18 +994,18 @@ func is12HourTime(format string) bool { return strings.Contains(format, "am/pm") || strings.Contains(format, "AM/PM") || strings.Contains(format, "a/p") || strings.Contains(format, "A/P") } -// stylesReader provides function to get the pointer to the structure after +// stylesReader provides a function to get the pointer to the structure after // deserialization of xl/styles.xml. func (f *File) stylesReader() *xlsxStyleSheet { if f.Styles == nil { var styleSheet xlsxStyleSheet - xml.Unmarshal([]byte(f.readXML("xl/styles.xml")), &styleSheet) + _ = xml.Unmarshal([]byte(f.readXML("xl/styles.xml")), &styleSheet) f.Styles = &styleSheet } return f.Styles } -// styleSheetWriter provides function to save xl/styles.xml after serialize +// styleSheetWriter provides a function to save xl/styles.xml after serialize // structure. func (f *File) styleSheetWriter() { if f.Styles != nil { @@ -1003,7 +1014,7 @@ func (f *File) styleSheetWriter() { } } -// parseFormatStyleSet provides function to parse the format settings of the +// parseFormatStyleSet provides a function to parse the format settings of the // cells and conditional formats. func parseFormatStyleSet(style string) (*formatStyle, error) { format := formatStyle{ @@ -1013,8 +1024,8 @@ func parseFormatStyleSet(style string) (*formatStyle, error) { return &format, err } -// NewStyle provides function to create style for cells by given style format. -// Note that the color field uses RGB color code. +// NewStyle provides a function to create style for cells by given style +// format. Note that the color field uses RGB color code. // // The following shows the border styles sorted by excelize index number: // @@ -1404,7 +1415,7 @@ func parseFormatStyleSet(style string) (*formatStyle, error) { // 173 | $ English (New Zealand) // 174 | $ English (Singapore) // 175 | $ English (Trinidad & Tobago) -// 176 | $ English (U.S. Vigin Islands) +// 176 | $ English (U.S. Virgin Islands) // 177 | $ English (United States) // 178 | $ French (Canada) // 179 | $ Hawaiian (United States) @@ -1906,10 +1917,10 @@ func (f *File) NewStyle(style string) (int, error) { return cellXfsID, nil } -// NewConditionalStyle provides function to create style for conditional format -// by given style format. The parameters are the same as function NewStyle(). -// Note that the color field uses RGB color code and only support to set font, -// fills, alignment and borders currently. +// NewConditionalStyle provides a function to create style for conditional +// format by given style format. The parameters are the same as function +// NewStyle(). Note that the color field uses RGB color code and only support +// to set font, fills, alignment and borders currently. func (f *File) NewConditionalStyle(style string) (int, error) { s := f.stylesReader() fs, err := parseFormatStyleSet(style) @@ -1935,7 +1946,8 @@ func (f *File) NewConditionalStyle(style string) (int, error) { return s.Dxfs.Count - 1, nil } -// setFont provides function to add font style by given cell format settings. +// setFont provides a function to add font style by given cell format +// settings. func setFont(formatStyle *formatStyle) *font { fontUnderlineType := map[string]string{"single": "single", "double": "double"} if formatStyle.Font.Size < 1 { @@ -1963,8 +1975,8 @@ func setFont(formatStyle *formatStyle) *font { return &f } -// setNumFmt provides function to check if number format code in the range of -// built-in values. +// setNumFmt provides a function to check if number format code in the range +// of built-in values. func setNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { dp := "0." numFmtID := 164 // Default custom number format code from 164. @@ -2011,7 +2023,7 @@ func setNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { return formatStyle.NumFmt } -// setCustomNumFmt provides function to set custom number format code. +// setCustomNumFmt provides a function to set custom number format code. func setCustomNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { nf := xlsxNumFmt{FormatCode: *formatStyle.CustomNumFmt} if style.NumFmts != nil { @@ -2029,7 +2041,7 @@ func setCustomNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { return nf.NumFmtID } -// setLangNumFmt provides function to set number format code with language. +// setLangNumFmt provides a function to set number format code with language. func setLangNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { numFmts, ok := langNumFmt[formatStyle.Lang] if !ok { @@ -2056,8 +2068,8 @@ func setLangNumFmt(style *xlsxStyleSheet, formatStyle *formatStyle) int { return nf.NumFmtID } -// setFills provides function to add fill elements in the styles.xml by given -// cell format settings. +// setFills provides a function to add fill elements in the styles.xml by +// given cell format settings. func setFills(formatStyle *formatStyle, fg bool) *xlsxFill { var patterns = []string{ "none", @@ -2137,9 +2149,10 @@ func setFills(formatStyle *formatStyle, fg bool) *xlsxFill { return &fill } -// setAlignment provides function to formatting information pertaining to text -// alignment in cells. There are a variety of choices for how text is aligned -// both horizontally and vertically, as well as indentation settings, and so on. +// setAlignment provides a function to formatting information pertaining to +// text alignment in cells. There are a variety of choices for how text is +// aligned both horizontally and vertically, as well as indentation settings, +// and so on. func setAlignment(formatStyle *formatStyle) *xlsxAlignment { var alignment xlsxAlignment if formatStyle.Alignment != nil { @@ -2156,7 +2169,7 @@ func setAlignment(formatStyle *formatStyle) *xlsxAlignment { return &alignment } -// setProtection provides function to set protection properties associated +// setProtection provides a function to set protection properties associated // with the cell. func setProtection(formatStyle *formatStyle) *xlsxProtection { var protection xlsxProtection @@ -2167,7 +2180,7 @@ func setProtection(formatStyle *formatStyle) *xlsxProtection { return &protection } -// setBorders provides function to add border elements in the styles.xml by +// setBorders provides a function to add border elements in the styles.xml by // given borders format settings. func setBorders(formatStyle *formatStyle) *xlsxBorder { var styles = []string{ @@ -2219,7 +2232,7 @@ func setBorders(formatStyle *formatStyle) *xlsxBorder { return &border } -// setCellXfs provides function to set describes all of the formatting for a +// setCellXfs provides a function to set describes all of the formatting for a // cell. func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, applyAlignment, applyProtection bool, alignment *xlsxAlignment, protection *xlsxProtection) int { var xf xlsxXf @@ -2246,9 +2259,10 @@ func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, a return style.CellXfs.Count - 1 } -// SetCellStyle provides function to add style attribute for cells by given +// SetCellStyle provides a function to add style attribute for cells by given // worksheet name, coordinate area and style ID. Note that diagonalDown and -// diagonalUp type border should be use same color in the same coordinate area. +// diagonalUp type border should be use same color in the same coordinate +// area. // // For example create a borders of cell H9 on Sheet1: // @@ -2352,9 +2366,10 @@ func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) { } } -// SetConditionalFormat provides function to create conditional formatting rule -// for cell value. Conditional formatting is a feature of Excel which allows you -// to apply a format to a cell or a range of cells based on certain criteria. +// SetConditionalFormat provides a function to create conditional formatting +// rule for cell value. Conditional formatting is a feature of Excel which +// allows you to apply a format to a cell or a range of cells based on certain +// criteria. // // The type option is a required parameter and it has no default value. // Allowable type values and their associated parameters are: @@ -2407,7 +2422,7 @@ func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) { // // The criteria parameter is used to set the criteria by which the cell data // will be evaluated. It has no default value. The most common criteria as -// applied to {'type': 'cell'} are: +// applied to {"type":"cell"} are: // // between | // not between | @@ -2562,10 +2577,12 @@ func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) { // // bar_color - Used for data_bar. Same as min_color, see above. // -func (f *File) SetConditionalFormat(sheet, area, formatSet string) { +func (f *File) SetConditionalFormat(sheet, area, formatSet string) error { var format []*formatConditional - json.Unmarshal([]byte(formatSet), &format) - + err := json.Unmarshal([]byte(formatSet), &format) + if err != nil { + return err + } drawContFmtFunc := map[string]func(p int, ct string, fmtCond *formatConditional) *xlsxCfRule{ "cellIs": drawCondFmtCellIs, "top10": drawCondFmtTop10, @@ -2601,11 +2618,12 @@ func (f *File) SetConditionalFormat(sheet, area, formatSet string) { SQRef: area, CfRule: cfRule, }) + return err } -// drawCondFmtCellIs provides function to create conditional formatting rule for -// cell value (include between, not between, equal, not equal, greater than and -// less than) by given priority, criteria type and format settings. +// drawCondFmtCellIs provides a function to create conditional formatting rule +// for cell value (include between, not between, equal, not equal, greater +// than and less than) by given priority, criteria type and format settings. func drawCondFmtCellIs(p int, ct string, format *formatConditional) *xlsxCfRule { c := &xlsxCfRule{ Priority: p + 1, @@ -2626,8 +2644,8 @@ func drawCondFmtCellIs(p int, ct string, format *formatConditional) *xlsxCfRule return c } -// drawCondFmtTop10 provides function to create conditional formatting rule for -// top N (default is top 10) by given priority, criteria type and format +// drawCondFmtTop10 provides a function to create conditional formatting rule +// for top N (default is top 10) by given priority, criteria type and format // settings. func drawCondFmtTop10(p int, ct string, format *formatConditional) *xlsxCfRule { c := &xlsxCfRule{ @@ -2644,9 +2662,9 @@ func drawCondFmtTop10(p int, ct string, format *formatConditional) *xlsxCfRule { return c } -// drawCondFmtAboveAverage provides function to create conditional formatting -// rule for above average and below average by given priority, criteria type and -// format settings. +// drawCondFmtAboveAverage provides a function to create conditional +// formatting rule for above average and below average by given priority, +// criteria type and format settings. func drawCondFmtAboveAverage(p int, ct string, format *formatConditional) *xlsxCfRule { return &xlsxCfRule{ Priority: p + 1, @@ -2656,7 +2674,7 @@ func drawCondFmtAboveAverage(p int, ct string, format *formatConditional) *xlsxC } } -// drawCondFmtDuplicateUniqueValues provides function to create conditional +// drawCondFmtDuplicateUniqueValues provides a function to create conditional // formatting rule for duplicate and unique values by given priority, criteria // type and format settings. func drawCondFmtDuplicateUniqueValues(p int, ct string, format *formatConditional) *xlsxCfRule { @@ -2667,16 +2685,29 @@ func drawCondFmtDuplicateUniqueValues(p int, ct string, format *formatConditiona } } -// drawCondFmtColorScale provides function to create conditional formatting rule -// for color scale (include 2 color scale and 3 color scale) by given priority, -// criteria type and format settings. +// drawCondFmtColorScale provides a function to create conditional formatting +// rule for color scale (include 2 color scale and 3 color scale) by given +// priority, criteria type and format settings. func drawCondFmtColorScale(p int, ct string, format *formatConditional) *xlsxCfRule { + minValue := format.MinValue + if minValue == "" { + minValue = "0" + } + maxValue := format.MaxValue + if maxValue == "" { + maxValue = "0" + } + midValue := format.MidValue + if midValue == "" { + midValue = "50" + } + c := &xlsxCfRule{ Priority: p + 1, Type: "colorScale", ColorScale: &xlsxColorScale{ Cfvo: []*xlsxCfvo{ - {Type: format.MinType}, + {Type: format.MinType, Val: minValue}, }, Color: []*xlsxColor{ {RGB: getPaletteColor(format.MinColor)}, @@ -2684,16 +2715,16 @@ func drawCondFmtColorScale(p int, ct string, format *formatConditional) *xlsxCfR }, } if validType[format.Type] == "3_color_scale" { - c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MidType, Val: 50}) + c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MidType, Val: midValue}) c.ColorScale.Color = append(c.ColorScale.Color, &xlsxColor{RGB: getPaletteColor(format.MidColor)}) } - c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MaxType}) + c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MaxType, Val: maxValue}) c.ColorScale.Color = append(c.ColorScale.Color, &xlsxColor{RGB: getPaletteColor(format.MaxColor)}) return c } -// drawCondFmtDataBar provides function to create conditional formatting rule -// for data bar by given priority, criteria type and format settings. +// drawCondFmtDataBar provides a function to create conditional formatting +// rule for data bar by given priority, criteria type and format settings. func drawCondFmtDataBar(p int, ct string, format *formatConditional) *xlsxCfRule { return &xlsxCfRule{ Priority: p + 1, @@ -2705,8 +2736,8 @@ func drawCondFmtDataBar(p int, ct string, format *formatConditional) *xlsxCfRule } } -// drawConfFmtExp provides function to create conditional formatting rule for -// expression by given priority, criteria type and format settings. +// drawConfFmtExp provides a function to create conditional formatting rule +// for expression by given priority, criteria type and format settings. func drawConfFmtExp(p int, ct string, format *formatConditional) *xlsxCfRule { return &xlsxCfRule{ Priority: p + 1, @@ -2716,7 +2747,34 @@ func drawConfFmtExp(p int, ct string, format *formatConditional) *xlsxCfRule { } } -// getPaletteColor provides function to convert the RBG color by given string. +// getPaletteColor provides a function to convert the RBG color by given +// string. func getPaletteColor(color string) string { return "FF" + strings.Replace(strings.ToUpper(color), "#", "", -1) } + +// themeReader provides a function to get the pointer to the xl/theme/theme1.xml +// structure after deserialization. +func (f *File) themeReader() *xlsxTheme { + var theme xlsxTheme + _ = xml.Unmarshal([]byte(f.readXML("xl/theme/theme1.xml")), &theme) + return &theme +} + +// ThemeColor applied the color with tint value. +func ThemeColor(baseColor string, tint float64) string { + if tint == 0 { + return "FF" + baseColor + } + r, _ := strconv.ParseInt(baseColor[0:2], 16, 64) + g, _ := strconv.ParseInt(baseColor[2:4], 16, 64) + b, _ := strconv.ParseInt(baseColor[4:6], 16, 64) + h, s, l := RGBToHSL(uint8(r), uint8(g), uint8(b)) + if tint < 0 { + l *= (1 + tint) + } else { + l = l*(1-tint) + (1 - (1 - tint)) + } + br, bg, bb := HSLToRGB(h, s, l) + return fmt.Sprintf("FF%02X%02X%02X", br, bg, bb) +} diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/table.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/table.go index 5af4b048b4..02c89fa561 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/table.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/table.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import ( @@ -9,15 +18,15 @@ import ( "strings" ) -// parseFormatTableSet provides function to parse the format settings of the +// parseFormatTableSet provides a function to parse the format settings of the // table with default value. -func parseFormatTableSet(formatSet string) *formatTable { +func parseFormatTableSet(formatSet string) (*formatTable, error) { format := formatTable{ TableStyle: "", ShowRowStripes: true, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal(parseFormatSet(formatSet), &format) + return &format, err } // AddTable provides the method to add table in a worksheet by given worksheet @@ -41,8 +50,11 @@ func parseFormatTableSet(formatSet string) *formatTable { // TableStyleMedium1 - TableStyleMedium28 // TableStyleDark1 - TableStyleDark11 // -func (f *File) AddTable(sheet, hcell, vcell, format string) { - formatSet := parseFormatTableSet(format) +func (f *File) AddTable(sheet, hcell, vcell, format string) error { + formatSet, err := parseFormatTableSet(format) + if err != nil { + return err + } hcell = strings.ToUpper(hcell) vcell = strings.ToUpper(vcell) // Coordinate conversion, convert C1:B3 to 2,0,1,2. @@ -69,10 +81,11 @@ func (f *File) AddTable(sheet, hcell, vcell, format string) { f.addSheetTable(sheet, rID) f.addTable(sheet, tableXML, hxAxis, hyAxis, vxAxis, vyAxis, tableID, formatSet) f.addContentTypePart(tableID, "table") + return err } -// countTables provides function to get table files count storage in the folder -// xl/tables. +// countTables provides a function to get table files count storage in the +// folder xl/tables. func (f *File) countTables() int { count := 0 for k := range f.XLSX { @@ -83,7 +96,7 @@ func (f *File) countTables() int { return count } -// addSheetTable provides function to add tablePart element to +// addSheetTable provides a function to add tablePart element to // xl/worksheets/sheet%d.xml by given worksheet name and relationship index. func (f *File) addSheetTable(sheet string, rID int) { xlsx := f.workSheetReader(sheet) @@ -97,8 +110,8 @@ func (f *File) addSheetTable(sheet string, rID int) { xlsx.TableParts.TableParts = append(xlsx.TableParts.TableParts, table) } -// addTable provides function to add table by given worksheet name, coordinate -// area and format set. +// addTable provides a function to add table by given worksheet name, +// coordinate area and format set. func (f *File) addTable(sheet, tableXML string, hxAxis, hyAxis, vxAxis, vyAxis, i int, formatSet *formatTable) { // Correct the minimum number of rows, the table at least two lines. if hyAxis == vyAxis { @@ -153,12 +166,12 @@ func (f *File) addTable(sheet, tableXML string, hxAxis, hyAxis, vxAxis, vyAxis, f.saveFileList(tableXML, table) } -// parseAutoFilterSet provides function to parse the settings of the auto +// parseAutoFilterSet provides a function to parse the settings of the auto // filter. -func parseAutoFilterSet(formatSet string) *formatAutoFilter { +func parseAutoFilterSet(formatSet string) (*formatAutoFilter, error) { format := formatAutoFilter{} - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AutoFilter provides the method to add auto filter in a worksheet by given @@ -232,7 +245,8 @@ func parseAutoFilterSet(formatSet string) *formatAutoFilter { // Price < 2000 // func (f *File) AutoFilter(sheet, hcell, vcell, format string) error { - formatSet := parseAutoFilterSet(format) + formatSet, _ := parseAutoFilterSet(format) + hcell = strings.ToUpper(hcell) vcell = strings.ToUpper(vcell) @@ -256,11 +270,10 @@ func (f *File) AutoFilter(sheet, hcell, vcell, format string) error { } ref := ToAlphaString(hxAxis) + strconv.Itoa(hyAxis+1) + ":" + ToAlphaString(vxAxis) + strconv.Itoa(vyAxis+1) refRange := vxAxis - hxAxis - err := f.autoFilter(sheet, ref, refRange, hxAxis, formatSet) - return err + return f.autoFilter(sheet, ref, refRange, hxAxis, formatSet) } -// autoFilter provides function to extract the tokens from the filter +// autoFilter provides a function to extract the tokens from the filter // expression. The tokens are mainly non-whitespace groups. func (f *File) autoFilter(sheet, ref string, refRange, hxAxis int, formatSet *formatAutoFilter) error { xlsx := f.workSheetReader(sheet) @@ -278,7 +291,7 @@ func (f *File) autoFilter(sheet, ref string, refRange, hxAxis int, formatSet *fo col := TitleToNumber(formatSet.Column) offset := col - hxAxis if offset < 0 || offset > refRange { - return fmt.Errorf("Incorrect index of column '%s'", formatSet.Column) + return fmt.Errorf("incorrect index of column '%s'", formatSet.Column) } filter.FilterColumn = &xlsxFilterColumn{ ColID: offset, @@ -286,7 +299,7 @@ func (f *File) autoFilter(sheet, ref string, refRange, hxAxis int, formatSet *fo re := regexp.MustCompile(`"(?:[^"]|"")*"|\S+`) token := re.FindAllString(formatSet.Expression, -1) if len(token) != 3 && len(token) != 7 { - return fmt.Errorf("Incorrect number of tokens in criteria '%s'", formatSet.Expression) + return fmt.Errorf("incorrect number of tokens in criteria '%s'", formatSet.Expression) } expressions, tokens, err := f.parseFilterExpression(formatSet.Expression, token) if err != nil { @@ -297,8 +310,8 @@ func (f *File) autoFilter(sheet, ref string, refRange, hxAxis int, formatSet *fo return nil } -// writeAutoFilter provides function to check for single or double custom filters -// as default filters and handle them accordingly. +// writeAutoFilter provides a function to check for single or double custom +// filters as default filters and handle them accordingly. func (f *File) writeAutoFilter(filter *xlsxAutoFilter, exp []int, tokens []string) { if len(exp) == 1 && exp[0] == 2 { // Single equality. @@ -325,7 +338,7 @@ func (f *File) writeAutoFilter(filter *xlsxAutoFilter, exp []int, tokens []strin } } -// writeCustomFilter provides function to write the element. +// writeCustomFilter provides a function to write the element. func (f *File) writeCustomFilter(filter *xlsxAutoFilter, operator int, val string) { operators := map[int]string{ 1: "lessThan", @@ -349,8 +362,9 @@ func (f *File) writeCustomFilter(filter *xlsxAutoFilter, operator int, val strin } } -// parseFilterExpression provides function to converts the tokens of a possibly -// conditional expression into 1 or 2 sub expressions for further parsing. +// parseFilterExpression provides a function to converts the tokens of a +// possibly conditional expression into 1 or 2 sub expressions for further +// parsing. // // Examples: // @@ -390,7 +404,7 @@ func (f *File) parseFilterExpression(expression string, tokens []string) ([]int, return expressions, t, nil } -// parseFilterTokens provides function to parse the 3 tokens of a filter +// parseFilterTokens provides a function to parse the 3 tokens of a filter // expression and return the operator and token. func (f *File) parseFilterTokens(expression string, tokens []string) ([]int, string, error) { operators := map[string]int{ @@ -410,7 +424,7 @@ func (f *File) parseFilterTokens(expression string, tokens []string) ([]int, str operator, ok := operators[strings.ToLower(tokens[1])] if !ok { // Convert the operator from a number to a descriptive string. - return []int{}, "", fmt.Errorf("Unknown operator: %s", tokens[1]) + return []int{}, "", fmt.Errorf("unknown operator: %s", tokens[1]) } token := tokens[2] // Special handling for Blanks/NonBlanks. @@ -418,7 +432,7 @@ func (f *File) parseFilterTokens(expression string, tokens []string) ([]int, str if re { // Only allow Equals or NotEqual in this context. if operator != 2 && operator != 5 { - return []int{operator}, token, fmt.Errorf("The operator '%s' in expression '%s' is not valid in relation to Blanks/NonBlanks'", tokens[1], expression) + return []int{operator}, token, fmt.Errorf("the operator '%s' in expression '%s' is not valid in relation to Blanks/NonBlanks'", tokens[1], expression) } token = strings.ToLower(token) // The operator should always be 2 (=) to flag a "simple" equality in diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/templates.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/templates.go index d3f82ee924..1d0655dc93 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/templates.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/templates.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. +// // This file contains default templates for XML files we don't yet populated // based on content. @@ -7,10 +16,12 @@ package excelize const XMLHeader = "\n" var ( + // XMLHeaderByte define an XML declaration can also contain a standalone + // declaration. XMLHeaderByte = []byte(XMLHeader) ) -const templateDocpropsApp = `0Golang Excelize` +const templateDocpropsApp = `0Go Excelize` const templateContentTypes = `` diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/vmlDrawing.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/vmlDrawing.go index 307186a95e..c17dde7887 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/vmlDrawing.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/vmlDrawing.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlChart.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlChart.go index a263334307..78218a01d4 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlChart.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlChart.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlComments.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlComments.go index fadc9b3873..9075c8873a 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlComments.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlComments.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" @@ -53,3 +62,11 @@ type formatComment struct { Author string `json:"author"` Text string `json:"text"` } + +// Comment directly maps the comment information. +type Comment struct { + Author string `json:"author"` + AuthorID int `json:"author_id"` + Ref string `json:"ref"` + Text string `json:"text"` +} diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlContentTypes.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlContentTypes.go index 121c6846bf..8d09d515ef 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlContentTypes.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlContentTypes.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDecodeDrawing.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDecodeDrawing.go index fff6b9debf..d21c3f01df 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDecodeDrawing.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDecodeDrawing.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDrawing.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDrawing.go index beb6bc94a4..6ba7d31d1f 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDrawing.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlDrawing.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlSharedStrings.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlSharedStrings.go index c8b54a013a..782ed61ad5 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlSharedStrings.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlSharedStrings.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlStyles.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlStyles.go index 05ff22bc4d..7ba4379148 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlStyles.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlStyles.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlTable.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlTable.go index b238350267..7e155e6d72 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlTable.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlTable.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorkbook.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorkbook.go index 816d5a4617..f00a0b8584 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorkbook.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorkbook.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" diff --git a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorksheet.go b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorksheet.go index 37c0d18e0d..072ecce6da 100644 --- a/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorksheet.go +++ b/vendor/github.com/360EntSecGroup-Skylar/excelize/xmlWorksheet.go @@ -1,3 +1,12 @@ +// Copyright 2016 - 2018 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excel™ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.8 or later. + package excelize import "encoding/xml" @@ -18,7 +27,7 @@ type xlsxWorksheet struct { MergeCells *xlsxMergeCells `xml:"mergeCells"` PhoneticPr *xlsxPhoneticPr `xml:"phoneticPr"` ConditionalFormatting []*xlsxConditionalFormatting `xml:"conditionalFormatting"` - DataValidations *xlsxDataValidations `xml:"dataValidations"` + DataValidations *xlsxDataValidations `xml:"dataValidations,omitempty"` Hyperlinks *xlsxHyperlinks `xml:"hyperlinks"` PrintOptions *xlsxPrintOptions `xml:"printOptions"` PageMargins *xlsxPageMargins `xml:"pageMargins"` @@ -294,11 +303,30 @@ type xlsxMergeCells struct { // xlsxDataValidations expresses all data validation information for cells in a // sheet which have data validation features applied. type xlsxDataValidations struct { - Count int `xml:"count,attr,omitempty"` - DisablePrompts bool `xml:"disablePrompts,attr,omitempty"` - XWindow int `xml:"xWindow,attr,omitempty"` - YWindow int `xml:"yWindow,attr,omitempty"` - DataValidation string `xml:",innerxml"` + Count int `xml:"count,attr,omitempty"` + DisablePrompts bool `xml:"disablePrompts,attr,omitempty"` + XWindow int `xml:"xWindow,attr,omitempty"` + YWindow int `xml:"yWindow,attr,omitempty"` + DataValidation []*DataValidation `xml:"dataValidation"` +} + +// DataValidation directly maps the a single item of data validation defined +// on a range of the worksheet. +type DataValidation struct { + AllowBlank bool `xml:"allowBlank,attr"` + Error *string `xml:"error,attr"` + ErrorStyle *string `xml:"errorStyle,attr"` + ErrorTitle *string `xml:"errorTitle,attr"` + Operator string `xml:"operator,attr"` + Prompt *string `xml:"prompt,attr"` + PromptTitle *string `xml:"promptTitle"` + ShowDropDown bool `xml:"showDropDown,attr"` + ShowErrorMessage bool `xml:"showErrorMessage,attr"` + ShowInputMessage bool `xml:"showInputMessage,attr"` + Sqref string `xml:"sqref,attr"` + Type string `xml:"type,attr"` + Formula1 string `xml:"formula1"` + Formula2 string `xml:"formula2"` } // xlsxC directly maps the c element in the namespace @@ -446,7 +474,7 @@ type xlsxIconSet struct { type xlsxCfvo struct { Gte bool `xml:"gte,attr,omitempty"` Type string `xml:"type,attr,omitempty"` - Val int `xml:"val,attr"` + Val string `xml:"val,attr"` ExtLst *xlsxExtLst `xml:"extLst"` } diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go index cacbd81571..e8893a282e 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/sender.go +++ b/vendor/github.com/Azure/go-autorest/autorest/sender.go @@ -234,7 +234,7 @@ func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) Se } delayed := DelayWithRetryAfter(resp, r.Context().Done()) if !delayed && !DelayForBackoff(backoff, attempt, r.Context().Done()) { - return nil, r.Context().Err() + return resp, r.Context().Err() } // don't count a 429 against the number of attempts // so that we continue to retry until it succeeds diff --git a/vendor/github.com/Azure/go-autorest/version/version.go b/vendor/github.com/Azure/go-autorest/version/version.go index ad2d6099f5..94de7c51e7 100644 --- a/vendor/github.com/Azure/go-autorest/version/version.go +++ b/vendor/github.com/Azure/go-autorest/version/version.go @@ -20,7 +20,7 @@ import ( ) // Number contains the semantic version of this SDK. -const Number = "v10.15.4" +const Number = "v10.15.5" var ( userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s", diff --git a/vendor/github.com/Shopify/sarama/.travis.yml b/vendor/github.com/Shopify/sarama/.travis.yml index 5e8d4979d9..fe694e5781 100644 --- a/vendor/github.com/Shopify/sarama/.travis.yml +++ b/vendor/github.com/Shopify/sarama/.travis.yml @@ -1,8 +1,8 @@ language: go go: -- 1.8.x -- 1.9.x -- 1.10.x +- 1.9.7 +- 1.10.4 +- 1.11 env: global: @@ -28,7 +28,7 @@ script: - make test - make vet - make errcheck -- make fmt +- if [ "$TRAVIS_GO_VERSION" = "1.11" ]; then make fmt; fi after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/Shopify/sarama/CHANGELOG.md b/vendor/github.com/Shopify/sarama/CHANGELOG.md index 57a2bf9ba2..47fb15b131 100644 --- a/vendor/github.com/Shopify/sarama/CHANGELOG.md +++ b/vendor/github.com/Shopify/sarama/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +#### Version 1.19.0 (2018-09-27) + +New Features: + - Implement a higher-level consumer group + ([#1099](https://github.com/Shopify/sarama/pull/1099)). + +Improvements: + - Add support for Go 1.11 + ([#1176](https://github.com/Shopify/sarama/pull/1176)). + +Bug Fixes: + - Fix encoding of `MetadataResponse` with version 2 and higher + ([#1174](https://github.com/Shopify/sarama/pull/1174)). + - Fix race condition in mock async producer + ([#1174](https://github.com/Shopify/sarama/pull/1174)). + #### Version 1.18.0 (2018-09-07) New Features: diff --git a/vendor/github.com/Shopify/sarama/Makefile b/vendor/github.com/Shopify/sarama/Makefile index b9a453dd29..8fcf219f44 100644 --- a/vendor/github.com/Shopify/sarama/Makefile +++ b/vendor/github.com/Shopify/sarama/Makefile @@ -4,7 +4,7 @@ default: fmt vet errcheck test test: echo "" > coverage.txt for d in `go list ./... | grep -v vendor`; do \ - go test -p 1 -v -timeout 90s -race -coverprofile=profile.out -covermode=atomic $$d || exit 1; \ + go test -p 1 -v -timeout 240s -race -coverprofile=profile.out -covermode=atomic $$d || exit 1; \ if [ -f profile.out ]; then \ cat profile.out >> coverage.txt; \ rm profile.out; \ diff --git a/vendor/github.com/Shopify/sarama/README.md b/vendor/github.com/Shopify/sarama/README.md index 4fc0cc600f..b99709380f 100644 --- a/vendor/github.com/Shopify/sarama/README.md +++ b/vendor/github.com/Shopify/sarama/README.md @@ -21,7 +21,7 @@ You might also want to look at the [Frequently Asked Questions](https://github.c Sarama provides a "2 releases + 2 months" compatibility guarantee: we support the two latest stable releases of Kafka and Go, and we provide a two month grace period for older releases. This means we currently officially support -Go 1.8 through 1.10, and Kafka 0.11 through 1.1, although older releases are +Go 1.8 through 1.11, and Kafka 1.0 through 2.0, although older releases are still likely to work. Sarama follows semantic versioning and provides API stability via the gopkg.in service. diff --git a/vendor/github.com/Shopify/sarama/config.go b/vendor/github.com/Shopify/sarama/config.go index 08f5330841..faf11e8383 100644 --- a/vendor/github.com/Shopify/sarama/config.go +++ b/vendor/github.com/Shopify/sarama/config.go @@ -173,14 +173,55 @@ type Config struct { // Consumer is the namespace for configuration related to consuming messages, // used by the Consumer. - // - // Note that Sarama's Consumer type does not currently support automatic - // consumer-group rebalancing and offset tracking. For Zookeeper-based - // tracking (Kafka 0.8.2 and earlier), the https://github.com/wvanbergen/kafka - // library builds on Sarama to add this support. For Kafka-based tracking - // (Kafka 0.9 and later), the https://github.com/bsm/sarama-cluster library - // builds on Sarama to add this support. Consumer struct { + + // Group is the namespace for configuring consumer group. + Group struct { + Session struct { + // The timeout used to detect consumer failures when using Kafka's group management facility. + // The consumer sends periodic heartbeats to indicate its liveness to the broker. + // If no heartbeats are received by the broker before the expiration of this session timeout, + // then the broker will remove this consumer from the group and initiate a rebalance. + // Note that the value must be in the allowable range as configured in the broker configuration + // by `group.min.session.timeout.ms` and `group.max.session.timeout.ms` (default 10s) + Timeout time.Duration + } + Heartbeat struct { + // The expected time between heartbeats to the consumer coordinator when using Kafka's group + // management facilities. Heartbeats are used to ensure that the consumer's session stays active and + // to facilitate rebalancing when new consumers join or leave the group. + // The value must be set lower than Consumer.Group.Session.Timeout, but typically should be set no + // higher than 1/3 of that value. + // It can be adjusted even lower to control the expected time for normal rebalances (default 3s) + Interval time.Duration + } + Rebalance struct { + // Strategy for allocating topic partitions to members (default BalanceStrategyRange) + Strategy BalanceStrategy + // The maximum allowed time for each worker to join the group once a rebalance has begun. + // This is basically a limit on the amount of time needed for all tasks to flush any pending + // data and commit offsets. If the timeout is exceeded, then the worker will be removed from + // the group, which will cause offset commit failures (default 60s). + Timeout time.Duration + + Retry struct { + // When a new consumer joins a consumer group the set of consumers attempt to "rebalance" + // the load to assign partitions to each consumer. If the set of consumers changes while + // this assignment is taking place the rebalance will fail and retry. This setting controls + // the maximum number of attempts before giving up (default 4). + Max int + // Backoff time between retries during rebalance (default 2s) + Backoff time.Duration + } + } + Member struct { + // Custom metadata to include when joining the group. The user data for all joined members + // can be retrieved by sending a DescribeGroupRequest to the broker that is the + // coordinator for the group. + UserData []byte + } + } + Retry struct { // How long to wait after a failing to read from a partition before // trying again (default 2s). @@ -331,6 +372,13 @@ func NewConfig() *Config { c.Consumer.Offsets.Initial = OffsetNewest c.Consumer.Offsets.Retry.Max = 3 + c.Consumer.Group.Session.Timeout = 10 * time.Second + c.Consumer.Group.Heartbeat.Interval = 3 * time.Second + c.Consumer.Group.Rebalance.Strategy = BalanceStrategyRange + c.Consumer.Group.Rebalance.Timeout = 60 * time.Second + c.Consumer.Group.Rebalance.Retry.Max = 4 + c.Consumer.Group.Rebalance.Retry.Backoff = 2 * time.Second + c.ClientID = defaultClientID c.ChannelBufferSize = 256 c.Version = MinVersion @@ -378,6 +426,15 @@ func (c *Config) Validate() error { if c.Consumer.Offsets.Retention%time.Millisecond != 0 { Logger.Println("Consumer.Offsets.Retention only supports millisecond precision; nanoseconds will be truncated.") } + if c.Consumer.Group.Session.Timeout%time.Millisecond != 0 { + Logger.Println("Consumer.Group.Session.Timeout only supports millisecond precision; nanoseconds will be truncated.") + } + if c.Consumer.Group.Heartbeat.Interval%time.Millisecond != 0 { + Logger.Println("Consumer.Group.Heartbeat.Interval only supports millisecond precision; nanoseconds will be truncated.") + } + if c.Consumer.Group.Rebalance.Timeout%time.Millisecond != 0 { + Logger.Println("Consumer.Group.Rebalance.Timeout only supports millisecond precision; nanoseconds will be truncated.") + } if c.ClientID == defaultClientID { Logger.Println("ClientID is the default of 'sarama', you should consider setting it to something application-specific.") } @@ -476,6 +533,24 @@ func (c *Config) Validate() error { return ConfigurationError("Consumer.Offsets.Retry.Max must be >= 0") } + // validate the Consumer Group values + switch { + case c.Consumer.Group.Session.Timeout <= 2*time.Millisecond: + return ConfigurationError("Consumer.Group.Session.Timeout must be >= 2ms") + case c.Consumer.Group.Heartbeat.Interval < 1*time.Millisecond: + return ConfigurationError("Consumer.Group.Heartbeat.Interval must be >= 1ms") + case c.Consumer.Group.Heartbeat.Interval >= c.Consumer.Group.Session.Timeout: + return ConfigurationError("Consumer.Group.Heartbeat.Interval must be < Consumer.Group.Session.Timeout") + case c.Consumer.Group.Rebalance.Strategy == nil: + return ConfigurationError("Consumer.Group.Rebalance.Strategy must not be empty") + case c.Consumer.Group.Rebalance.Timeout <= time.Millisecond: + return ConfigurationError("Consumer.Group.Rebalance.Timeout must be >= 1ms") + case c.Consumer.Group.Rebalance.Retry.Max < 0: + return ConfigurationError("Consumer.Group.Rebalance.Retry.Max must be >= 0") + case c.Consumer.Group.Rebalance.Retry.Backoff < 0: + return ConfigurationError("Consumer.Group.Rebalance.Retry.Backoff must be >= 0") + } + // validate misc shared values switch { case c.ChannelBufferSize < 0: diff --git a/vendor/github.com/Shopify/sarama/dev.yml b/vendor/github.com/Shopify/sarama/dev.yml index bc8c4e4529..97eed3ad98 100644 --- a/vendor/github.com/Shopify/sarama/dev.yml +++ b/vendor/github.com/Shopify/sarama/dev.yml @@ -2,7 +2,7 @@ name: sarama up: - go: - version: '1.10' + version: '1.11' commands: test: diff --git a/vendor/github.com/Shopify/sarama/metadata_response.go b/vendor/github.com/Shopify/sarama/metadata_response.go index bf8a67bbc5..c402d05fa3 100644 --- a/vendor/github.com/Shopify/sarama/metadata_response.go +++ b/vendor/github.com/Shopify/sarama/metadata_response.go @@ -207,6 +207,10 @@ func (r *MetadataResponse) decode(pd packetDecoder, version int16) (err error) { } func (r *MetadataResponse) encode(pe packetEncoder) error { + if r.Version >= 3 { + pe.putInt32(r.ThrottleTimeMs) + } + err := pe.putArrayLength(len(r.Brokers)) if err != nil { return err @@ -218,6 +222,13 @@ func (r *MetadataResponse) encode(pe packetEncoder) error { } } + if r.Version >= 2 { + err := pe.putNullableString(r.ClusterID) + if err != nil { + return err + } + } + if r.Version >= 1 { pe.putInt32(r.ControllerID) } diff --git a/vendor/github.com/Shopify/sarama/offset_manager.go b/vendor/github.com/Shopify/sarama/offset_manager.go index 2a1a89f3af..8ea857f835 100644 --- a/vendor/github.com/Shopify/sarama/offset_manager.go +++ b/vendor/github.com/Shopify/sarama/offset_manager.go @@ -27,11 +27,14 @@ type offsetManager struct { group string ticker *time.Ticker + memberID string + generation int32 + broker *Broker brokerLock sync.RWMutex poms map[string]map[int32]*partitionOffsetManager - pomsLock sync.Mutex + pomsLock sync.RWMutex closeOnce sync.Once closing chan none @@ -41,6 +44,10 @@ type offsetManager struct { // NewOffsetManagerFromClient creates a new OffsetManager from the given client. // It is still necessary to call Close() on the underlying client when finished with the partition manager. func NewOffsetManagerFromClient(group string, client Client) (OffsetManager, error) { + return newOffsetManagerFromClient(group, "", GroupGenerationUndefined, client) +} + +func newOffsetManagerFromClient(group, memberID string, generation int32, client Client) (*offsetManager, error) { // Check that we are not dealing with a closed Client before processing any other arguments if client.Closed() { return nil, ErrClosedClient @@ -54,6 +61,9 @@ func NewOffsetManagerFromClient(group string, client Client) (OffsetManager, err ticker: time.NewTicker(conf.Consumer.Offsets.CommitInterval), poms: make(map[string]map[int32]*partitionOffsetManager), + memberID: memberID, + generation: generation, + closing: make(chan none), closed: make(chan none), } @@ -245,20 +255,22 @@ func (om *offsetManager) constructRequest() *OffsetCommitRequest { r = &OffsetCommitRequest{ Version: 1, ConsumerGroup: om.group, - ConsumerGroupGeneration: GroupGenerationUndefined, + ConsumerID: om.memberID, + ConsumerGroupGeneration: om.generation, } } else { r = &OffsetCommitRequest{ Version: 2, RetentionTime: int64(om.conf.Consumer.Offsets.Retention / time.Millisecond), ConsumerGroup: om.group, - ConsumerGroupGeneration: GroupGenerationUndefined, + ConsumerID: om.memberID, + ConsumerGroupGeneration: om.generation, } } - om.pomsLock.Lock() - defer om.pomsLock.Unlock() + om.pomsLock.RLock() + defer om.pomsLock.RUnlock() for _, topicManagers := range om.poms { for _, pom := range topicManagers { @@ -278,8 +290,8 @@ func (om *offsetManager) constructRequest() *OffsetCommitRequest { } func (om *offsetManager) handleResponse(broker *Broker, req *OffsetCommitRequest, resp *OffsetCommitResponse) { - om.pomsLock.Lock() - defer om.pomsLock.Unlock() + om.pomsLock.RLock() + defer om.pomsLock.RUnlock() for _, topicManagers := range om.poms { for _, pom := range topicManagers { @@ -329,8 +341,8 @@ func (om *offsetManager) handleResponse(broker *Broker, req *OffsetCommitRequest } func (om *offsetManager) handleError(err error) { - om.pomsLock.Lock() - defer om.pomsLock.Unlock() + om.pomsLock.RLock() + defer om.pomsLock.RUnlock() for _, topicManagers := range om.poms { for _, pom := range topicManagers { @@ -340,8 +352,8 @@ func (om *offsetManager) handleError(err error) { } func (om *offsetManager) asyncClosePOMs() { - om.pomsLock.Lock() - defer om.pomsLock.Unlock() + om.pomsLock.RLock() + defer om.pomsLock.RUnlock() for _, topicManagers := range om.poms { for _, pom := range topicManagers { @@ -375,6 +387,18 @@ func (om *offsetManager) releasePOMs(force bool) (remaining int) { return } +func (om *offsetManager) findPOM(topic string, partition int32) *partitionOffsetManager { + om.pomsLock.RLock() + defer om.pomsLock.RUnlock() + + if partitions, ok := om.poms[topic]; ok { + if pom, ok := partitions[partition]; ok { + return pom + } + } + return nil +} + // Partition Offset Manager // PartitionOffsetManager uses Kafka to store and fetch consumed partition offsets. You MUST call Close() diff --git a/vendor/github.com/googollee/go-socket.io/.travis.yml b/vendor/github.com/googollee/go-socket.io/.travis.yml index 7141eabd29..2b5f7929c8 100644 --- a/vendor/github.com/googollee/go-socket.io/.travis.yml +++ b/vendor/github.com/googollee/go-socket.io/.travis.yml @@ -1,5 +1,7 @@ language: go -go: 1.5 +go: +- 1.7 +- 1.11 install: - go get "github.com/smartystreets/goconvey/convey" - go get -v . diff --git a/vendor/github.com/googollee/go-socket.io/server.go b/vendor/github.com/googollee/go-socket.io/server.go index 4e8d687c12..02fd438637 100644 --- a/vendor/github.com/googollee/go-socket.io/server.go +++ b/vendor/github.com/googollee/go-socket.io/server.go @@ -93,8 +93,8 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // BroadcastTo is a server level broadcast function. -func (s *Server) BroadcastTo(room, message string, args ...interface{}) { - s.namespace.BroadcastTo(room, message, args...) +func (s *Server) BroadcastTo(room, event string, args ...interface{}) { + s.namespace.BroadcastTo(room, event, args...) } func (s *Server) loop() { diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index e9556282da..67f884b0d4 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -1665,9 +1665,9 @@ func setTA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { return nil, &ParseError{f, "bad TA DigestType", l}, "" } rr.DigestType = uint8(i) - s, e, c1 := endingToString(c, "bad TA Digest", f) - if e != nil { - return nil, e.(*ParseError), c1 + s, err, c1 := endingToString(c, "bad TA Digest", f) + if err != nil { + return nil, err, c1 } rr.Digest = s return rr, nil, c1 diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 4fbf7db6f5..2901f8724c 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -63,6 +63,12 @@ type ResponseWriter interface { Hijack() } +// A ConnectionStater interface is used by a DNS Handler to access TLS connection state +// when available. +type ConnectionStater interface { + ConnectionState() *tls.ConnectionState +} + type response struct { msg []byte hijacked bool // connection has been hijacked by handler @@ -894,3 +900,15 @@ func (w *response) Close() error { } return nil } + +// ConnectionState() implements the ConnectionStater.ConnectionState() interface. +func (w *response) ConnectionState() *tls.ConnectionState { + type tlsConnectionStater interface { + ConnectionState() tls.ConnectionState + } + if v, ok := w.tcp.(tlsConnectionStater); ok { + t := v.ConnectionState() + return &t + } + return nil +} diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index 18d1aa1f91..ade7586dc1 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = V{1, 0, 9} +var Version = V{1, 0, 10} // V holds the version of this library. type V struct { diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar index 3ee8291e81..13c831ef59 100644 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ b/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -15,6 +15,9 @@ Lines: 1 vim Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/cwd +SymlinkTo: /usr/bin +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/26231/exe SymlinkTo: /usr/bin/vim # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -111,6 +114,9 @@ SymlinkTo: mnt:[4026531840] Path: fixtures/26231/ns/net SymlinkTo: net:[4026531993] # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/root +SymlinkTo: / +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/26231/stat Lines: 1 26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 @@ -128,6 +134,9 @@ Lines: 1 ata_sff Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/cwd +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/26232/fd Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -167,6 +176,9 @@ Max realtime priority 0 0 Max realtime timeout unlimited unlimited us Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/root +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/26232/stat Lines: 1 33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 @@ -444,3 +456,7 @@ Path: fixtures/symlinktargets/xyz Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/.unpacked +Lines: 0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index 7cf5b8acf9..06bed0ef4a 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -156,6 +156,26 @@ func (p Proc) Executable() (string, error) { return exe, err } +// Cwd returns the absolute path to the current working directory of the process. +func (p Proc) Cwd() (string, error) { + wd, err := os.Readlink(p.path("cwd")) + if os.IsNotExist(err) { + return "", nil + } + + return wd, err +} + +// RootDir returns the absolute path to the process's root directory (as set by chroot) +func (p Proc) RootDir() (string, error) { + rdir, err := os.Readlink(p.path("root")) + if os.IsNotExist(err) { + return "", nil + } + + return rdir, err +} + // FileDescriptors returns the currently open file descriptors of a process. func (p Proc) FileDescriptors() ([]uintptr, error) { names, err := p.fileDescriptors() diff --git a/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml index 2f19b4a757..1f953bebdc 100644 --- a/vendor/github.com/sirupsen/logrus/.travis.yml +++ b/vendor/github.com/sirupsen/logrus/.travis.yml @@ -1,13 +1,51 @@ language: go -go: - - 1.9.x - - 1.10.x env: - GOMAXPROCS=4 GORACE=halt_on_error=1 -install: - - go get github.com/stretchr/testify/assert - - go get gopkg.in/gemnasium/logrus-airbrake-hook.v2 - - go get golang.org/x/sys/unix - - go get golang.org/x/sys/windows -script: - - go test -race -v ./... +matrix: + include: + - go: 1.10.x + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v ./... + - go: 1.11.x + env: GO111MODULE=on + install: + - go mod download + script: + - go test -race -v ./... + - go: 1.11.x + env: GO111MODULE=off + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v ./... + - go: 1.10.x + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v -tags appengine ./... + - go: 1.11.x + env: GO111MODULE=on + install: + - go mod download + script: + - go test -race -v -tags appengine ./... + - go: 1.11.x + env: GO111MODULE=off + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v -tags appengine ./... diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md index 1bd1deb294..1702696087 100644 --- a/vendor/github.com/sirupsen/logrus/CHANGELOG.md +++ b/vendor/github.com/sirupsen/logrus/CHANGELOG.md @@ -1,3 +1,33 @@ +# 1.1.0 +This new release introduces: + * several fixes: + * a fix for a race condition on entry formatting + * proper cleanup of previously used entries before putting them back in the pool + * the extra new line at the end of message in text formatter has been removed + * a new global public API to check if a level is activated: IsLevelEnabled + * the following methods have been added to the Logger object + * IsLevelEnabled + * SetFormatter + * SetOutput + * ReplaceHooks + * introduction of go module + * an indent configuration for the json formatter + * output colour support for windows + * the field sort function is now configurable for text formatter + * the CLICOLOR and CLICOLOR\_FORCE environment variable support in text formater + +# 1.0.6 + +This new release introduces: + * a new api WithTime which allows to easily force the time of the log entry + which is mostly useful for logger wrapper + * a fix reverting the immutability of the entry given as parameter to the hooks + a new configuration field of the json formatter in order to put all the fields + in a nested dictionnary + * a new SetOutput method in the Logger + * a new configuration of the textformatter to configure the name of the default keys + * a new configuration of the text formatter to disable the level truncation + # 1.0.5 * Fix hooks race (#707) diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go index 473bd1a0d3..4efedddfea 100644 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ b/vendor/github.com/sirupsen/logrus/entry.go @@ -41,7 +41,7 @@ type Entry struct { // Message passed to Debug, Info, Warn, Error, Fatal or Panic Message string - // When formatter is called in entry.log(), an Buffer may be set to entry + // When formatter is called in entry.log(), a Buffer may be set to entry Buffer *bytes.Buffer } @@ -137,9 +137,9 @@ func (entry *Entry) fireHooks() { } func (entry *Entry) write() { - serialized, err := entry.Logger.Formatter.Format(entry) entry.Logger.mu.Lock() defer entry.Logger.mu.Unlock() + serialized, err := entry.Logger.Formatter.Format(entry) if err != nil { fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) } else { @@ -151,7 +151,7 @@ func (entry *Entry) write() { } func (entry *Entry) Debug(args ...interface{}) { - if entry.Logger.level() >= DebugLevel { + if entry.Logger.IsLevelEnabled(DebugLevel) { entry.log(DebugLevel, fmt.Sprint(args...)) } } @@ -161,13 +161,13 @@ func (entry *Entry) Print(args ...interface{}) { } func (entry *Entry) Info(args ...interface{}) { - if entry.Logger.level() >= InfoLevel { + if entry.Logger.IsLevelEnabled(InfoLevel) { entry.log(InfoLevel, fmt.Sprint(args...)) } } func (entry *Entry) Warn(args ...interface{}) { - if entry.Logger.level() >= WarnLevel { + if entry.Logger.IsLevelEnabled(WarnLevel) { entry.log(WarnLevel, fmt.Sprint(args...)) } } @@ -177,20 +177,20 @@ func (entry *Entry) Warning(args ...interface{}) { } func (entry *Entry) Error(args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { + if entry.Logger.IsLevelEnabled(ErrorLevel) { entry.log(ErrorLevel, fmt.Sprint(args...)) } } func (entry *Entry) Fatal(args ...interface{}) { - if entry.Logger.level() >= FatalLevel { + if entry.Logger.IsLevelEnabled(FatalLevel) { entry.log(FatalLevel, fmt.Sprint(args...)) } Exit(1) } func (entry *Entry) Panic(args ...interface{}) { - if entry.Logger.level() >= PanicLevel { + if entry.Logger.IsLevelEnabled(PanicLevel) { entry.log(PanicLevel, fmt.Sprint(args...)) } panic(fmt.Sprint(args...)) @@ -199,13 +199,13 @@ func (entry *Entry) Panic(args ...interface{}) { // Entry Printf family functions func (entry *Entry) Debugf(format string, args ...interface{}) { - if entry.Logger.level() >= DebugLevel { + if entry.Logger.IsLevelEnabled(DebugLevel) { entry.Debug(fmt.Sprintf(format, args...)) } } func (entry *Entry) Infof(format string, args ...interface{}) { - if entry.Logger.level() >= InfoLevel { + if entry.Logger.IsLevelEnabled(InfoLevel) { entry.Info(fmt.Sprintf(format, args...)) } } @@ -215,7 +215,7 @@ func (entry *Entry) Printf(format string, args ...interface{}) { } func (entry *Entry) Warnf(format string, args ...interface{}) { - if entry.Logger.level() >= WarnLevel { + if entry.Logger.IsLevelEnabled(WarnLevel) { entry.Warn(fmt.Sprintf(format, args...)) } } @@ -225,20 +225,20 @@ func (entry *Entry) Warningf(format string, args ...interface{}) { } func (entry *Entry) Errorf(format string, args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { + if entry.Logger.IsLevelEnabled(ErrorLevel) { entry.Error(fmt.Sprintf(format, args...)) } } func (entry *Entry) Fatalf(format string, args ...interface{}) { - if entry.Logger.level() >= FatalLevel { + if entry.Logger.IsLevelEnabled(FatalLevel) { entry.Fatal(fmt.Sprintf(format, args...)) } Exit(1) } func (entry *Entry) Panicf(format string, args ...interface{}) { - if entry.Logger.level() >= PanicLevel { + if entry.Logger.IsLevelEnabled(PanicLevel) { entry.Panic(fmt.Sprintf(format, args...)) } } @@ -246,13 +246,13 @@ func (entry *Entry) Panicf(format string, args ...interface{}) { // Entry Println family functions func (entry *Entry) Debugln(args ...interface{}) { - if entry.Logger.level() >= DebugLevel { + if entry.Logger.IsLevelEnabled(DebugLevel) { entry.Debug(entry.sprintlnn(args...)) } } func (entry *Entry) Infoln(args ...interface{}) { - if entry.Logger.level() >= InfoLevel { + if entry.Logger.IsLevelEnabled(InfoLevel) { entry.Info(entry.sprintlnn(args...)) } } @@ -262,7 +262,7 @@ func (entry *Entry) Println(args ...interface{}) { } func (entry *Entry) Warnln(args ...interface{}) { - if entry.Logger.level() >= WarnLevel { + if entry.Logger.IsLevelEnabled(WarnLevel) { entry.Warn(entry.sprintlnn(args...)) } } @@ -272,20 +272,20 @@ func (entry *Entry) Warningln(args ...interface{}) { } func (entry *Entry) Errorln(args ...interface{}) { - if entry.Logger.level() >= ErrorLevel { + if entry.Logger.IsLevelEnabled(ErrorLevel) { entry.Error(entry.sprintlnn(args...)) } } func (entry *Entry) Fatalln(args ...interface{}) { - if entry.Logger.level() >= FatalLevel { + if entry.Logger.IsLevelEnabled(FatalLevel) { entry.Fatal(entry.sprintlnn(args...)) } Exit(1) } func (entry *Entry) Panicln(args ...interface{}) { - if entry.Logger.level() >= PanicLevel { + if entry.Logger.IsLevelEnabled(PanicLevel) { entry.Panic(entry.sprintlnn(args...)) } } diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go index eb612a6f3e..fb2a7a1f07 100644 --- a/vendor/github.com/sirupsen/logrus/exported.go +++ b/vendor/github.com/sirupsen/logrus/exported.go @@ -21,30 +21,27 @@ func SetOutput(out io.Writer) { // SetFormatter sets the standard logger formatter. func SetFormatter(formatter Formatter) { - std.mu.Lock() - defer std.mu.Unlock() - std.Formatter = formatter + std.SetFormatter(formatter) } // SetLevel sets the standard logger level. func SetLevel(level Level) { - std.mu.Lock() - defer std.mu.Unlock() std.SetLevel(level) } // GetLevel returns the standard logger level. func GetLevel() Level { - std.mu.Lock() - defer std.mu.Unlock() - return std.level() + return std.GetLevel() +} + +// IsLevelEnabled checks if the log level of the standard logger is greater than the level param +func IsLevelEnabled(level Level) bool { + return std.IsLevelEnabled(level) } // AddHook adds a hook to the standard logger hooks. func AddHook(hook Hook) { - std.mu.Lock() - defer std.mu.Unlock() - std.Hooks.Add(hook) + std.AddHook(hook) } // WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. diff --git a/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go index dab17610f1..d3dadefe69 100644 --- a/vendor/github.com/sirupsen/logrus/json_formatter.go +++ b/vendor/github.com/sirupsen/logrus/json_formatter.go @@ -1,6 +1,7 @@ package logrus import ( + "bytes" "encoding/json" "fmt" ) @@ -46,6 +47,9 @@ type JSONFormatter struct { // }, // } FieldMap FieldMap + + // PrettyPrint will indent all json logs + PrettyPrint bool } // Format renders a single log entry @@ -81,9 +85,20 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() - serialized, err := json.Marshal(data) - if err != nil { + var b *bytes.Buffer + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + encoder := json.NewEncoder(b) + if f.PrettyPrint { + encoder.SetIndent("", " ") + } + if err := encoder.Encode(data); err != nil { return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) } - return append(serialized, '\n'), nil + + return b.Bytes(), nil } diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go index 342f7977d8..b67bfcbd3c 100644 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ b/vendor/github.com/sirupsen/logrus/logger.go @@ -11,7 +11,7 @@ import ( type Logger struct { // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a // file, or leave it default which is `os.Stderr`. You can also set this to - // something more adventorous, such as logging to Kafka. + // something more adventurous, such as logging to Kafka. Out io.Writer // Hooks for the logger instance. These allow firing events based on logging // levels and log entries. For example, to send errors to an error tracking @@ -85,6 +85,7 @@ func (logger *Logger) newEntry() *Entry { } func (logger *Logger) releaseEntry(entry *Entry) { + entry.Data = map[string]interface{}{} logger.entryPool.Put(entry) } @@ -121,7 +122,7 @@ func (logger *Logger) WithTime(t time.Time) *Entry { } func (logger *Logger) Debugf(format string, args ...interface{}) { - if logger.level() >= DebugLevel { + if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() entry.Debugf(format, args...) logger.releaseEntry(entry) @@ -129,7 +130,7 @@ func (logger *Logger) Debugf(format string, args ...interface{}) { } func (logger *Logger) Infof(format string, args ...interface{}) { - if logger.level() >= InfoLevel { + if logger.IsLevelEnabled(InfoLevel) { entry := logger.newEntry() entry.Infof(format, args...) logger.releaseEntry(entry) @@ -143,7 +144,7 @@ func (logger *Logger) Printf(format string, args ...interface{}) { } func (logger *Logger) Warnf(format string, args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warnf(format, args...) logger.releaseEntry(entry) @@ -151,7 +152,7 @@ func (logger *Logger) Warnf(format string, args ...interface{}) { } func (logger *Logger) Warningf(format string, args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warnf(format, args...) logger.releaseEntry(entry) @@ -159,7 +160,7 @@ func (logger *Logger) Warningf(format string, args ...interface{}) { } func (logger *Logger) Errorf(format string, args ...interface{}) { - if logger.level() >= ErrorLevel { + if logger.IsLevelEnabled(ErrorLevel) { entry := logger.newEntry() entry.Errorf(format, args...) logger.releaseEntry(entry) @@ -167,7 +168,7 @@ func (logger *Logger) Errorf(format string, args ...interface{}) { } func (logger *Logger) Fatalf(format string, args ...interface{}) { - if logger.level() >= FatalLevel { + if logger.IsLevelEnabled(FatalLevel) { entry := logger.newEntry() entry.Fatalf(format, args...) logger.releaseEntry(entry) @@ -176,7 +177,7 @@ func (logger *Logger) Fatalf(format string, args ...interface{}) { } func (logger *Logger) Panicf(format string, args ...interface{}) { - if logger.level() >= PanicLevel { + if logger.IsLevelEnabled(PanicLevel) { entry := logger.newEntry() entry.Panicf(format, args...) logger.releaseEntry(entry) @@ -184,7 +185,7 @@ func (logger *Logger) Panicf(format string, args ...interface{}) { } func (logger *Logger) Debug(args ...interface{}) { - if logger.level() >= DebugLevel { + if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() entry.Debug(args...) logger.releaseEntry(entry) @@ -192,7 +193,7 @@ func (logger *Logger) Debug(args ...interface{}) { } func (logger *Logger) Info(args ...interface{}) { - if logger.level() >= InfoLevel { + if logger.IsLevelEnabled(InfoLevel) { entry := logger.newEntry() entry.Info(args...) logger.releaseEntry(entry) @@ -206,7 +207,7 @@ func (logger *Logger) Print(args ...interface{}) { } func (logger *Logger) Warn(args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warn(args...) logger.releaseEntry(entry) @@ -214,7 +215,7 @@ func (logger *Logger) Warn(args ...interface{}) { } func (logger *Logger) Warning(args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warn(args...) logger.releaseEntry(entry) @@ -222,7 +223,7 @@ func (logger *Logger) Warning(args ...interface{}) { } func (logger *Logger) Error(args ...interface{}) { - if logger.level() >= ErrorLevel { + if logger.IsLevelEnabled(ErrorLevel) { entry := logger.newEntry() entry.Error(args...) logger.releaseEntry(entry) @@ -230,7 +231,7 @@ func (logger *Logger) Error(args ...interface{}) { } func (logger *Logger) Fatal(args ...interface{}) { - if logger.level() >= FatalLevel { + if logger.IsLevelEnabled(FatalLevel) { entry := logger.newEntry() entry.Fatal(args...) logger.releaseEntry(entry) @@ -239,7 +240,7 @@ func (logger *Logger) Fatal(args ...interface{}) { } func (logger *Logger) Panic(args ...interface{}) { - if logger.level() >= PanicLevel { + if logger.IsLevelEnabled(PanicLevel) { entry := logger.newEntry() entry.Panic(args...) logger.releaseEntry(entry) @@ -247,7 +248,7 @@ func (logger *Logger) Panic(args ...interface{}) { } func (logger *Logger) Debugln(args ...interface{}) { - if logger.level() >= DebugLevel { + if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() entry.Debugln(args...) logger.releaseEntry(entry) @@ -255,7 +256,7 @@ func (logger *Logger) Debugln(args ...interface{}) { } func (logger *Logger) Infoln(args ...interface{}) { - if logger.level() >= InfoLevel { + if logger.IsLevelEnabled(InfoLevel) { entry := logger.newEntry() entry.Infoln(args...) logger.releaseEntry(entry) @@ -269,7 +270,7 @@ func (logger *Logger) Println(args ...interface{}) { } func (logger *Logger) Warnln(args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warnln(args...) logger.releaseEntry(entry) @@ -277,7 +278,7 @@ func (logger *Logger) Warnln(args ...interface{}) { } func (logger *Logger) Warningln(args ...interface{}) { - if logger.level() >= WarnLevel { + if logger.IsLevelEnabled(WarnLevel) { entry := logger.newEntry() entry.Warnln(args...) logger.releaseEntry(entry) @@ -285,7 +286,7 @@ func (logger *Logger) Warningln(args ...interface{}) { } func (logger *Logger) Errorln(args ...interface{}) { - if logger.level() >= ErrorLevel { + if logger.IsLevelEnabled(ErrorLevel) { entry := logger.newEntry() entry.Errorln(args...) logger.releaseEntry(entry) @@ -293,7 +294,7 @@ func (logger *Logger) Errorln(args ...interface{}) { } func (logger *Logger) Fatalln(args ...interface{}) { - if logger.level() >= FatalLevel { + if logger.IsLevelEnabled(FatalLevel) { entry := logger.newEntry() entry.Fatalln(args...) logger.releaseEntry(entry) @@ -302,7 +303,7 @@ func (logger *Logger) Fatalln(args ...interface{}) { } func (logger *Logger) Panicln(args ...interface{}) { - if logger.level() >= PanicLevel { + if logger.IsLevelEnabled(PanicLevel) { entry := logger.newEntry() entry.Panicln(args...) logger.releaseEntry(entry) @@ -320,18 +321,47 @@ func (logger *Logger) level() Level { return Level(atomic.LoadUint32((*uint32)(&logger.Level))) } +// SetLevel sets the logger level. func (logger *Logger) SetLevel(level Level) { atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) } -func (logger *Logger) SetOutput(out io.Writer) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.Out = out +// GetLevel returns the logger level. +func (logger *Logger) GetLevel() Level { + return logger.level() } +// AddHook adds a hook to the logger hooks. func (logger *Logger) AddHook(hook Hook) { logger.mu.Lock() defer logger.mu.Unlock() logger.Hooks.Add(hook) } + +// IsLevelEnabled checks if the log level of the logger is greater than the level param +func (logger *Logger) IsLevelEnabled(level Level) bool { + return logger.level() >= level +} + +// SetFormatter sets the logger formatter. +func (logger *Logger) SetFormatter(formatter Formatter) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Formatter = formatter +} + +// SetOutput sets the logger output. +func (logger *Logger) SetOutput(output io.Writer) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Out = output +} + +// ReplaceHooks replaces the logger hooks and returns the old ones +func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { + logger.mu.Lock() + oldHooks := logger.Hooks + logger.Hooks = hooks + logger.mu.Unlock() + return oldHooks +} diff --git a/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/sirupsen/logrus/logrus.go index dd38999741..fa0b9dea8a 100644 --- a/vendor/github.com/sirupsen/logrus/logrus.go +++ b/vendor/github.com/sirupsen/logrus/logrus.go @@ -140,4 +140,11 @@ type FieldLogger interface { Errorln(args ...interface{}) Fatalln(args ...interface{}) Panicln(args ...interface{}) + + // IsDebugEnabled() bool + // IsInfoEnabled() bool + // IsWarnEnabled() bool + // IsErrorEnabled() bool + // IsFatalEnabled() bool + // IsPanicEnabled() bool } diff --git a/vendor/github.com/sirupsen/logrus/terminal_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_bsd.go index 4880d13d26..62ca252d06 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_bsd.go +++ b/vendor/github.com/sirupsen/logrus/terminal_bsd.go @@ -1,10 +1,17 @@ // +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine,!gopherjs +// +build !appengine,!js package logrus -import "golang.org/x/sys/unix" +import ( + "io" + + "golang.org/x/sys/unix" +) const ioctlReadTermios = unix.TIOCGETA type Termios unix.Termios + +func initTerminal(w io.Writer) { +} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go index 3de08e802f..2403de9819 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go @@ -1,4 +1,4 @@ -// +build appengine gopherjs +// +build appengine package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go index 067047a123..cf309d6fb6 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go @@ -1,4 +1,4 @@ -// +build !appengine,!gopherjs +// +build !appengine,!js,!windows package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_linux.go b/vendor/github.com/sirupsen/logrus/terminal_linux.go index f29a0097c8..18066f08ab 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_linux.go +++ b/vendor/github.com/sirupsen/logrus/terminal_linux.go @@ -3,12 +3,19 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !appengine,!gopherjs +// +build !appengine,!js package logrus -import "golang.org/x/sys/unix" +import ( + "io" + + "golang.org/x/sys/unix" +) const ioctlReadTermios = unix.TCGETS type Termios unix.Termios + +func initTerminal(w io.Writer) { +} diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go index 3e55040304..67fb686c6b 100644 --- a/vendor/github.com/sirupsen/logrus/text_formatter.go +++ b/vendor/github.com/sirupsen/logrus/text_formatter.go @@ -3,6 +3,7 @@ package logrus import ( "bytes" "fmt" + "os" "sort" "strings" "sync" @@ -35,6 +36,9 @@ type TextFormatter struct { // Force disabling colors. DisableColors bool + // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/ + EnvironmentOverrideColors bool + // Disable timestamp logging. useful when output is redirected to logging // system that already adds timestamps. DisableTimestamp bool @@ -51,6 +55,9 @@ type TextFormatter struct { // be desired. DisableSorting bool + // The keys sorting function, when uninitialized it uses sort.Strings. + SortingFunc func([]string) + // Disables the truncation of the level text to 4 characters. DisableLevelTruncation bool @@ -69,15 +76,35 @@ type TextFormatter struct { // FieldKeyMsg: "@message"}} FieldMap FieldMap - sync.Once + terminalInitOnce sync.Once } func (f *TextFormatter) init(entry *Entry) { if entry.Logger != nil { f.isTerminal = checkIfTerminal(entry.Logger.Out) + + if f.isTerminal { + initTerminal(entry.Logger.Out) + } } } +func (f *TextFormatter) isColored() bool { + isColored := f.ForceColors || f.isTerminal + + if f.EnvironmentOverrideColors { + if force, ok := os.LookupEnv("CLICOLOR_FORCE"); ok && force != "0" { + isColored = true + } else if ok && force == "0" { + isColored = false + } else if os.Getenv("CLICOLOR") == "0" { + isColored = false + } + } + + return isColored && !f.DisableColors +} + // Format renders a single log entry func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { prefixFieldClashes(entry.Data, f.FieldMap) @@ -87,8 +114,29 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { keys = append(keys, k) } + fixedKeys := make([]string, 0, 3+len(entry.Data)) + if !f.DisableTimestamp { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime)) + } + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel)) + if entry.Message != "" { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg)) + } + if !f.DisableSorting { - sort.Strings(keys) + if f.SortingFunc == nil { + sort.Strings(keys) + fixedKeys = append(fixedKeys, keys...) + } else { + if !f.isColored() { + fixedKeys = append(fixedKeys, keys...) + f.SortingFunc(fixedKeys) + } else { + f.SortingFunc(keys) + } + } + } else { + fixedKeys = append(fixedKeys, keys...) } var b *bytes.Buffer @@ -98,26 +146,28 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { b = &bytes.Buffer{} } - f.Do(func() { f.init(entry) }) - - isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + f.terminalInitOnce.Do(func() { f.init(entry) }) timestampFormat := f.TimestampFormat if timestampFormat == "" { timestampFormat = defaultTimestampFormat } - if isColored { + if f.isColored() { f.printColored(b, entry, keys, timestampFormat) } else { - if !f.DisableTimestamp { - f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyTime), entry.Time.Format(timestampFormat)) - } - f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyLevel), entry.Level.String()) - if entry.Message != "" { - f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyMsg), entry.Message) - } - for _, key := range keys { - f.appendKeyValue(b, key, entry.Data[key]) + for _, key := range fixedKeys { + var value interface{} + switch key { + case f.FieldMap.resolve(FieldKeyTime): + value = entry.Time.Format(timestampFormat) + case f.FieldMap.resolve(FieldKeyLevel): + value = entry.Level.String() + case f.FieldMap.resolve(FieldKeyMsg): + value = entry.Message + default: + value = entry.Data[key] + } + f.appendKeyValue(b, key, value) } } @@ -143,6 +193,10 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin levelText = levelText[0:4] } + // Remove a single newline if it already exists in the message to keep + // the behavior of logrus text_formatter the same as the stdlib log package + entry.Message = strings.TrimSuffix(entry.Message, "\n") + if f.DisableTimestamp { fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) } else if !f.FullTimestamp { diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go index 8a9711f6e4..fae5c8adc5 100644 --- a/vendor/golang.org/x/net/http2/write.go +++ b/vendor/golang.org/x/net/http2/write.go @@ -199,7 +199,7 @@ func (w *writeResHeaders) staysWithinBuffer(max int) bool { // TODO: this is a common one. It'd be nice to return true // here and get into the fast path if we could be clever and // calculate the size fast enough, or at least a conservative - // uppper bound that usually fires. (Maybe if w.h and + // upper bound that usually fires. (Maybe if w.h and // w.trailers are nil, so we don't need to enumerate it.) // Otherwise I'm afraid that just calculating the length to // answer this question would be slower than the ~2µs benefit. diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go index 27f92c99db..5e5fb45104 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go @@ -6,17 +6,7 @@ // +build ppc // Functions to access/create device major and minor numbers matching the -// encoding used by the Linux kernel and glibc. -// -// The information below is extracted and adapted from bits/sysmacros.h in the -// glibc sources: -// -// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's -// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major -// number and m is a hex digit of the minor number. This is backward compatible -// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also -// backward compatible with the Linux kernel, which for some architectures uses -// 32-bit dev_t, encoded as mmmM MMmm. +// encoding used by AIX. package unix diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go index 65d93a6899..8b401244c4 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go @@ -6,17 +6,7 @@ // +build ppc64 // Functions to access/create device major and minor numbers matching the -// encoding used by the Linux kernel and glibc. -// -// The information below is extracted and adapted from bits/sysmacros.h in the -// glibc sources: -// -// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's -// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major -// number and m is a hex digit of the minor number. This is backward compatible -// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also -// backward compatible with the Linux kernel, which for some architectures uses -// 32-bit dev_t, encoded as mmmM MMmm. +// encoding used AIX. package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go index 8c9aaeb273..f121a8d64b 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 787ae75997..ec8e613226 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -46,6 +46,7 @@ includes_AIX=' #include #include #include +#include #include #include @@ -86,6 +87,7 @@ includes_DragonFly=' #include #include #include +#include #include #include #include @@ -215,6 +217,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -245,6 +248,16 @@ struct ltchars { #define FS_KEY_DESC_PREFIX "fscrypt:" #define FS_KEY_DESC_PREFIX_SIZE 8 #define FS_MAX_KEY_SIZE 64 + +// XDP socket constants do not appear to be picked up otherwise. +// Copied from samples/bpf/xdpsock_user.c. +#ifndef SOL_XDP +#define SOL_XDP 283 +#endif + +#ifndef AF_XDP +#define AF_XDP 44 +#endif ' includes_NetBSD=' @@ -253,6 +266,7 @@ includes_NetBSD=' #include #include #include +#include #include #include #include @@ -278,6 +292,7 @@ includes_OpenBSD=' #include #include #include +#include #include #include #include @@ -379,6 +394,7 @@ ccflags="$@" $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + $2 !~ /^ECCAPBITS/ && $2 !~ /^ETH_/ && $2 !~ /^EPROC_/ && $2 !~ /^EQUIV_/ && @@ -425,6 +441,7 @@ ccflags="$@" $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || $2 ~ /^HW_MACHINE$/ || $2 ~ /^SYSCTL_VERS/ || + $2 !~ "MNT_BITS" && $2 ~ /^(MS|MNT|UMOUNT)_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || @@ -475,6 +492,7 @@ ccflags="$@" $2 ~ /^FSOPT_/ || $2 ~ /^WDIOC_/ || $2 ~ /^NFN/ || + $2 ~ /^XDP_/ || $2 ~ /^(HDIO|WIN|SMART)_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 86d7c7bd01..df1f9ea3d5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -345,11 +345,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } @@ -419,8 +419,10 @@ func Flock(fd int, how int) (err error) { //sysnb Getsid(pid int) (sid int, err error) //sysnb Kill(pid int, sig syscall.Signal) (err error) //sys Klogctl(typ int, buf []byte) (n int, err error) = syslog +//sys Mkdir(dirfd int, path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index e193fd30bc..02cf204a12 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -692,6 +692,24 @@ func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil } +type SockaddrXDP struct { + Flags uint16 + Ifindex uint32 + QueueID uint32 + SharedUmemFD uint32 + raw RawSockaddrXDP +} + +func (sa *SockaddrXDP) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_XDP + sa.raw.Flags = sa.Flags + sa.raw.Ifindex = sa.Ifindex + sa.raw.Queue_id = sa.QueueID + sa.raw.Shared_umem_fd = sa.SharedUmemFD + + return unsafe.Pointer(&sa.raw), SizeofSockaddrXDP, nil +} + func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -793,6 +811,15 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { } return sa, nil } + case AF_XDP: + pp := (*RawSockaddrXDP)(unsafe.Pointer(rsa)) + sa := &SockaddrXDP{ + Flags: pp.Flags, + Ifindex: pp.Ifindex, + QueueID: pp.Queue_id, + SharedUmemFD: pp.Shared_umem_fd, + } + return sa, nil } return nil, EAFNOSUPPORT } @@ -1273,6 +1300,7 @@ func Mount(source string, target string, fstype string, flags uintptr, data stri //sys Adjtimex(buf *Timex) (state int, err error) //sys Chdir(path string) (err error) //sys Chroot(path string) (err error) +//sys ClockGetres(clockid int32, res *Timespec) (err error) //sys ClockGettime(clockid int32, time *Timespec) (err error) //sys Close(fd int) (err error) //sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) @@ -1496,7 +1524,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { // Brk // Capget // Capset -// ClockGetres // ClockNanosleep // ClockSettime // Clone diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 6f8ebde3a4..639bcdef74 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -93,6 +93,23 @@ func nametomib(name string) (mib []_C_int, err error) { return mib, nil } +func SysctlClockinfo(name string) (*Clockinfo, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + n := uintptr(SizeofClockinfo) + buf := make([]byte, SizeofClockinfo) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofClockinfo { + return nil, EIO + } + return (*Clockinfo)(unsafe.Pointer(&buf[0])), nil +} + //sysnb pipe() (fd1 int, fd2 int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/golang.org/x/sys/unix/types_aix.go index 355ad6cf5f..18fbddd52c 100644 --- a/vendor/golang.org/x/sys/unix/types_aix.go +++ b/vendor/golang.org/x/sys/unix/types_aix.go @@ -22,6 +22,11 @@ package unix #include #include #include +#include +#include +#include +#include +#include #include @@ -33,7 +38,6 @@ package unix #include #include -#include enum { sizeofPtr = sizeof(void*), @@ -224,6 +228,9 @@ type Flock_t C.struct_flock64 // Statfs +type Fsid_t C.struct_fsid_t +type Fsid64_t C.struct_fsid64_t + type Statfs_t C.struct_statfs const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go index 1494aafcbb..c49621ce52 100644 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ b/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -279,3 +279,9 @@ type Sysctlnode C.struct_sysctlnode // Uname type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go index 17c1537f26..4b7b965027 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go @@ -867,6 +867,9 @@ const ( TAB2 = 0x800 TAB3 = 0xc00 TABDLY = 0xc00 + TCFLSH = 0x540c + TCGETA = 0x5405 + TCGETS = 0x5401 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -915,6 +918,15 @@ const ( TCP_TIMESTAMP_OPTLEN = 0xc TCP_UNSETPRIV = 0x28 TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETSF = 0x5404 + TCSETSW = 0x5403 + TCXONC = 0x540b + TIOC = 0x5400 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go index fdfd25ccde..ed04fd1b77 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go @@ -867,6 +867,9 @@ const ( TAB2 = 0x800 TAB3 = 0xc00 TABDLY = 0xc00 + TCFLSH = 0x540c + TCGETA = 0x5405 + TCGETS = 0x5401 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -915,6 +918,15 @@ const ( TCP_TIMESTAMP_OPTLEN = 0xc TCP_UNSETPRIV = 0x28 TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETSF = 0x5404 + TCSETSW = 0x5403 + TCXONC = 0x540b + TIOC = 0x5400 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0xffffffff80047462 diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go index 1de6998946..bbe6089bb7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -880,6 +880,40 @@ const ( MAP_VPAGETABLE = 0x2000 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x20 + MNT_CMDFLAGS = 0xf0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x4 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SYNCHRONOUS = 0x2 + MNT_TRIM = 0x1000000 + MNT_UPDATE = 0x10000 + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0xf1f0ffff + MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x1000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 3800ff3739..fe564160bf 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1811,6 +1812,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2293,6 +2295,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 9c204cf7b0..dcfa667495 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1812,6 +1813,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2293,6 +2295,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 03e2b3414d..c2ef50c658 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1818,6 +1819,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2299,6 +2301,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index bc9a8bb9c1..1a820d668f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1802,6 +1803,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2284,6 +2286,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 2309829ec5..b515b2a63f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1811,6 +1812,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 @@ -2295,6 +2297,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 0660b02dca..29a88f0e5e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1811,6 +1812,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 @@ -2295,6 +2297,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 2761f2a63a..0767ac1b0d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1811,6 +1812,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 @@ -2295,6 +2297,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 127bf06fd8..269b813182 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1811,6 +1812,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 @@ -2295,6 +2297,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index d972fd8270..eb52e9689f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1867,6 +1868,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2352,6 +2354,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0xc00 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index b6e169aa76..0563d34b31 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1867,6 +1868,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2352,6 +2354,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0xc00 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index de94141fe5..e95e3f6778 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1799,6 +1800,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2280,6 +2282,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 0e4dba121e..bad17418e8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -64,6 +64,7 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + AF_XDP = 0x2c ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 @@ -1872,6 +1873,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_X25 = 0x106 + SOL_XDP = 0x11b SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 @@ -2353,6 +2355,26 @@ const ( XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XTABS = 0x1800 ZSMALLOC_MAGIC = 0x58295829 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go index 19316b1d09..78cc04ea6d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -1020,6 +1020,43 @@ const ( MAP_WIRED = 0x800 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 @@ -1113,7 +1150,10 @@ const ( RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go index f2cf500f50..92185e693f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -1010,6 +1010,43 @@ const ( MAP_WIRED = 0x800 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 @@ -1103,7 +1140,10 @@ const ( RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go index 858e29998d..373ad4543d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -1000,6 +1000,43 @@ const ( MAP_STACK = 0x2000 MAP_TRYFIXED = 0x400 MAP_WIRED = 0x800 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 @@ -1093,7 +1130,10 @@ const ( RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go index 7d92f2c53f..d8be045189 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -899,6 +899,32 @@ const ( MAP_TRYFIXED = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 MSG_BCAST = 0x100 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go index b0a7ebafcc..12261a562f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -939,6 +939,32 @@ const ( MAP_TRYFIXED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CTRUNC = 0x20 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go index 50c1d9f35d..79d5695c37 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -899,6 +899,32 @@ const ( MAP_TRYFIXED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CTRUNC = 0x20 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 46d0652fb2..ab2f761223 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -39,8 +39,10 @@ int getrusage(int, uintptr_t); int getsid(int); int kill(int, int); int syslog(int, uintptr_t, size_t); +int mkdir(int, uintptr_t, unsigned int); int mkdirat(int, uintptr_t, unsigned int); int mkfifo(uintptr_t, unsigned int); +int mknod(uintptr_t, unsigned int, int); int mknodat(int, uintptr_t, unsigned int, int); int nanosleep(uintptr_t, uintptr_t); int open64(uintptr_t, int, unsigned int); @@ -502,6 +504,17 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdir(dirfd int, path string, mode uint32) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mkdir(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.mkdirat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) @@ -524,6 +537,17 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mknod(path string, mode uint32, dev int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mknod(C.uintptr_t(_p0), C.uint(mode), C.int(dev)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.mknodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(dev)) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index b33f9eccfc..2e4f93fb1f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -39,8 +39,10 @@ int getrusage(int, uintptr_t); int getsid(int); int kill(int, int); int syslog(int, uintptr_t, size_t); +int mkdir(int, uintptr_t, unsigned int); int mkdirat(int, uintptr_t, unsigned int); int mkfifo(uintptr_t, unsigned int); +int mknod(uintptr_t, unsigned int, int); int mknodat(int, uintptr_t, unsigned int, int); int nanosleep(uintptr_t, uintptr_t); int open64(uintptr_t, int, unsigned int); @@ -502,6 +504,17 @@ func Klogctl(typ int, buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mkdir(dirfd int, path string, mode uint32) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mkdir(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mkdirat(dirfd int, path string, mode uint32) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.mkdirat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) @@ -524,6 +537,17 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mknod(path string, mode uint32, dev int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mknod(C.uintptr_t(_p0), C.uint(mode), C.int(dev)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.mknodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(dev)) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index a1c7d785f4..35b155a02b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 47503919ad..11a30786cf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 389c42af3f..914f25f062 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 97f6a2c56a..1d6c55628c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 889eaf1a19..260631d146 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 06016870e1..ff2d84fb9f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 76dc324b8b..48d14e6074 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index a8428e9236..12c17a92bd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 971b72b519..8300814d2c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { @@ -979,7 +989,7 @@ func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func MemfdCreate(name string, flags uint) (fd int, err error) { +func MemfdCreate(name string, flags int) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 52f3faaf95..002b4e175a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { @@ -979,7 +989,7 @@ func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func MemfdCreate(name string, flags uint) (fd int, err error) { +func MemfdCreate(name string, flags int) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index b030fc8b91..542f3a3a3d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { @@ -979,7 +989,7 @@ func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func MemfdCreate(name string, flags uint) (fd int, err error) { +func MemfdCreate(name string, flags int) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 4d7f1e9268..1a9ba99925 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -417,6 +417,16 @@ func Chroot(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { @@ -979,7 +989,7 @@ func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func MemfdCreate(name string, flags uint) (fd int, err error) { +func MemfdCreate(name string, flags int) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go index ee455365f3..f1cfe7db15 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -268,9 +268,22 @@ type Termios struct { Cc [16]uint8 } -type Termio struct{} +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line uint8 + Cc [8]uint8 + _ [1]byte +} -type Winsize struct{} +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} type PollFd struct { Fd int32 @@ -301,6 +314,32 @@ type Flock_t struct { Len int64 } -type Statfs_t struct{} +type Fsid_t struct { + Val [2]uint32 +} +type Fsid64_t struct { + Val [2]uint64 +} + +type Statfs_t struct { + Version int32 + Type int32 + Bsize uint32 + Blocks uint32 + Bfree uint32 + Bavail uint32 + Files uint32 + Ffree uint32 + Fsid Fsid_t + Vfstype int32 + Fsize uint32 + Vfsnumber int32 + Vfsoff int32 + Vfslen int32 + Vfsvers int32 + Fname [32]uint8 + Fpack [32]uint8 + Name_max int32 +} const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go index cdb1699d56..95581a3bc3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -275,9 +275,22 @@ type Termios struct { Cc [16]uint8 } -type Termio struct{} +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line uint8 + Cc [8]uint8 + _ [1]byte +} -type Winsize struct{} +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} type PollFd struct { Fd int32 @@ -308,6 +321,34 @@ type Flock_t struct { Len int64 } -type Statfs_t struct{} +type Fsid_t struct { + Val [2]uint32 +} +type Fsid64_t struct { + Val [2]uint64 +} + +type Statfs_t struct { + Version int32 + Type int32 + Bsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid64_t + Vfstype int32 + _ [4]byte + Fsize uint64 + Vfsnumber int32 + Vfsoff int32 + Vfslen int32 + Vfsvers int32 + Fname [32]uint8 + Fpack [32]uint8 + Name_max int32 + _ [4]byte +} const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 1944dfb1a4..793b3fdd21 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -278,6 +278,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -412,6 +420,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -517,6 +526,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1889,3 +1905,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index dd09289d14..c3548848a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -280,6 +280,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -416,6 +424,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -521,6 +530,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1911,3 +1927,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index d9e844d8c9..c7b6994329 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -281,6 +281,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -415,6 +423,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -520,6 +529,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1879,3 +1895,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index fd2471a3cf..2339b21298 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -281,6 +281,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -417,6 +425,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -522,6 +531,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1890,3 +1906,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 89218d9d1b..013462ba5d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -279,6 +279,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -413,6 +421,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -518,6 +527,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1884,3 +1900,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 059903972d..86f0ab5520 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -281,6 +281,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -417,6 +425,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -522,6 +531,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1892,3 +1908,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index c933cea679..007537b4d3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -281,6 +281,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -417,6 +425,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -522,6 +531,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1892,3 +1908,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 92d358ae19..fc4a159124 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -279,6 +279,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -413,6 +421,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -518,6 +527,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1884,3 +1900,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 2dbda84397..377e9efdfc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -282,6 +282,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -418,6 +426,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -523,6 +532,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1900,3 +1916,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index b1d2357034..595ba63030 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -282,6 +282,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -418,6 +426,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -523,6 +532,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1900,3 +1916,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 0a34ccdd75..0ccf5bc3e1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -281,6 +281,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -417,6 +425,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -522,6 +531,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1917,3 +1933,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 0c790546b2..06b07852d1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -280,6 +280,14 @@ type RawSockaddrVM struct { Zero [4]uint8 } +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -416,6 +424,7 @@ const ( SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -521,6 +530,13 @@ const ( RTA_PREF = 0x14 RTA_ENCAP_TYPE = 0x15 RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 @@ -1917,3 +1933,35 @@ const ( NETNSA_PID = 0x2 NETNSA_FD = 0x3 ) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 4b86fb2b33..9e9088de11 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -446,3 +446,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 9048a509d0..ed3f17366a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -453,3 +453,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 00525e7b02..d263b61476 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -451,3 +451,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +}