From c9be030088077b43cdac43da078ed05542acca63 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Sat, 21 Dec 2024 17:10:10 +0100 Subject: [PATCH] chore: go mod vendor --- Dockerfile | 8 +- Makefile | 10 + hack/vendor.Dockerfile | 29 +- vendor/github.com/Azure/go-ansiterm/LICENSE | 21 + vendor/github.com/Azure/go-ansiterm/README.md | 12 + .../github.com/Azure/go-ansiterm/constants.go | 188 + .../github.com/Azure/go-ansiterm/context.go | 7 + .../Azure/go-ansiterm/csi_entry_state.go | 49 + .../Azure/go-ansiterm/csi_param_state.go | 38 + .../go-ansiterm/escape_intermediate_state.go | 36 + .../Azure/go-ansiterm/escape_state.go | 47 + .../Azure/go-ansiterm/event_handler.go | 90 + .../Azure/go-ansiterm/ground_state.go | 24 + .../Azure/go-ansiterm/osc_string_state.go | 31 + vendor/github.com/Azure/go-ansiterm/parser.go | 151 + .../go-ansiterm/parser_action_helpers.go | 99 + .../Azure/go-ansiterm/parser_actions.go | 119 + vendor/github.com/Azure/go-ansiterm/states.go | 71 + .../github.com/Azure/go-ansiterm/utilities.go | 21 + .../Azure/go-ansiterm/winterm/ansi.go | 196 + .../Azure/go-ansiterm/winterm/api.go | 327 + .../go-ansiterm/winterm/attr_translation.go | 100 + .../go-ansiterm/winterm/cursor_helpers.go | 101 + .../go-ansiterm/winterm/erase_helpers.go | 84 + .../go-ansiterm/winterm/scroll_helper.go | 118 + .../Azure/go-ansiterm/winterm/utilities.go | 9 + .../go-ansiterm/winterm/win_event_handler.go | 743 + .../github.com/Microsoft/go-winio/.gitignore | 1 + .../github.com/Microsoft/go-winio/CODEOWNERS | 1 + vendor/github.com/Microsoft/go-winio/LICENSE | 22 + .../github.com/Microsoft/go-winio/README.md | 22 + .../github.com/Microsoft/go-winio/backup.go | 280 + vendor/github.com/Microsoft/go-winio/ea.go | 137 + vendor/github.com/Microsoft/go-winio/file.go | 323 + .../github.com/Microsoft/go-winio/fileinfo.go | 73 + .../github.com/Microsoft/go-winio/hvsock.go | 307 + vendor/github.com/Microsoft/go-winio/pipe.go | 517 + .../Microsoft/go-winio/pkg/guid/guid.go | 237 + .../Microsoft/go-winio/privilege.go | 202 + .../github.com/Microsoft/go-winio/reparse.go | 128 + vendor/github.com/Microsoft/go-winio/sd.go | 98 + .../github.com/Microsoft/go-winio/syscall.go | 3 + .../Microsoft/go-winio/zsyscall_windows.go | 427 + vendor/github.com/alecthomas/kong/.gitignore | 0 .../github.com/alecthomas/kong/.golangci.yml | 89 + vendor/github.com/alecthomas/kong/COPYING | 19 + vendor/github.com/alecthomas/kong/README.md | 746 + vendor/github.com/alecthomas/kong/build.go | 360 + .../github.com/alecthomas/kong/callbacks.go | 129 + .../github.com/alecthomas/kong/camelcase.go | 90 + vendor/github.com/alecthomas/kong/context.go | 1019 ++ vendor/github.com/alecthomas/kong/defaults.go | 21 + vendor/github.com/alecthomas/kong/doc.go | 32 + vendor/github.com/alecthomas/kong/error.go | 12 + vendor/github.com/alecthomas/kong/global.go | 16 + .../github.com/alecthomas/kong/guesswidth.go | 10 + .../alecthomas/kong/guesswidth_unix.go | 42 + vendor/github.com/alecthomas/kong/help.go | 579 + vendor/github.com/alecthomas/kong/hooks.go | 19 + .../github.com/alecthomas/kong/interpolate.go | 52 + vendor/github.com/alecthomas/kong/kong.go | 449 + vendor/github.com/alecthomas/kong/kong.png | Bin 0 -> 68610 bytes vendor/github.com/alecthomas/kong/kong.sketch | Bin 0 -> 162506 bytes .../github.com/alecthomas/kong/levenshtein.go | 39 + vendor/github.com/alecthomas/kong/mapper.go | 934 ++ vendor/github.com/alecthomas/kong/model.go | 509 + vendor/github.com/alecthomas/kong/options.go | 493 + .../github.com/alecthomas/kong/renovate.json5 | 18 + vendor/github.com/alecthomas/kong/resolver.go | 68 + vendor/github.com/alecthomas/kong/scanner.go | 222 + vendor/github.com/alecthomas/kong/tag.go | 351 + vendor/github.com/alecthomas/kong/util.go | 57 + vendor/github.com/alecthomas/kong/visit.go | 58 + vendor/github.com/beorn7/perks/LICENSE | 20 + .../beorn7/perks/quantile/exampledata.txt | 2388 +++ .../beorn7/perks/quantile/stream.go | 316 + .../github.com/cespare/xxhash/v2/.travis.yml | 8 + .../github.com/cespare/xxhash/v2/LICENSE.txt | 22 + vendor/github.com/cespare/xxhash/v2/README.md | 67 + vendor/github.com/cespare/xxhash/v2/xxhash.go | 236 + .../cespare/xxhash/v2/xxhash_amd64.go | 13 + .../cespare/xxhash/v2/xxhash_amd64.s | 215 + .../cespare/xxhash/v2/xxhash_other.go | 76 + .../cespare/xxhash/v2/xxhash_safe.go | 15 + .../cespare/xxhash/v2/xxhash_unsafe.go | 46 + .../distribution/distribution/LICENSE | 202 + .../reference/helpers_deprecated.go | 34 + .../reference/normalize_deprecated.go | 92 + .../reference/reference_deprecated.go | 172 + .../reference/regexp_deprecated.go | 50 + .../distribution/reference/sort_deprecated.go | 10 + .../distribution/reference/.gitattributes | 1 + .../distribution/reference/.gitignore | 2 + .../distribution/reference/.golangci.yml | 18 + .../distribution/reference/CODE-OF-CONDUCT.md | 5 + .../distribution/reference/CONTRIBUTING.md | 114 + .../distribution/reference/GOVERNANCE.md | 144 + .../github.com/distribution/reference/LICENSE | 202 + .../distribution/reference/MAINTAINERS | 26 + .../distribution/reference/Makefile | 25 + .../distribution/reference/README.md | 30 + .../distribution/reference/SECURITY.md | 7 + .../reference/distribution-logo.svg | 1 + .../distribution/reference/helpers.go | 42 + .../distribution/reference/normalize.go | 224 + .../distribution/reference/reference.go | 436 + .../distribution/reference/regexp.go | 163 + .../github.com/distribution/reference/sort.go | 75 + vendor/github.com/docker/cli/AUTHORS | 852 ++ vendor/github.com/docker/cli/LICENSE | 191 + vendor/github.com/docker/cli/NOTICE | 19 + .../github.com/docker/cli/cli/command/cli.go | 536 + .../docker/cli/cli/command/cli_options.go | 97 + .../docker/cli/cli/command/context.go | 65 + .../cli/cli/command/defaultcontextstore.go | 191 + .../docker/cli/cli/command/events_utils.go | 47 + .../docker/cli/cli/command/registry.go | 215 + .../docker/cli/cli/command/trust.go | 15 + .../docker/cli/cli/command/utils.go | 197 + .../docker/cli/cli/config/config.go | 153 + .../docker/cli/cli/config/configfile/file.go | 352 + .../cli/cli/config/configfile/file_unix.go | 36 + .../cli/cli/config/configfile/file_windows.go | 5 + .../cli/cli/config/credentials/credentials.go | 17 + .../cli/config/credentials/default_store.go | 21 + .../credentials/default_store_darwin.go | 5 + .../config/credentials/default_store_linux.go | 13 + .../credentials/default_store_unsupported.go | 8 + .../credentials/default_store_windows.go | 5 + .../cli/cli/config/credentials/file_store.go | 81 + .../cli/config/credentials/native_store.go | 143 + .../docker/cli/cli/config/types/authconfig.go | 22 + .../cli/connhelper/commandconn/commandconn.go | 289 + .../connhelper/commandconn/pdeathsig_linux.go | 10 + .../commandconn/pdeathsig_nolinux.go | 11 + .../connhelper/commandconn/session_unix.go | 14 + .../connhelper/commandconn/session_windows.go | 8 + .../docker/cli/cli/connhelper/connhelper.go | 82 + .../docker/cli/cli/connhelper/ssh/ssh.go | 63 + .../cli/cli/context/docker/constants.go | 6 + .../docker/cli/cli/context/docker/load.go | 154 + .../docker/cli/cli/context/endpoint.go | 7 + .../docker/cli/cli/context/store/doc.go | 32 + .../docker/cli/cli/context/store/io_utils.go | 29 + .../cli/cli/context/store/metadatastore.go | 164 + .../docker/cli/cli/context/store/store.go | 501 + .../cli/cli/context/store/storeconfig.go | 53 + .../docker/cli/cli/context/store/tlsstore.go | 96 + .../docker/cli/cli/context/tlsdata.go | 98 + .../github.com/docker/cli/cli/debug/debug.go | 26 + .../docker/cli/cli/flags/options.go | 135 + .../github.com/docker/cli/cli/hints/hints.go | 18 + .../docker/cli/cli/manifest/store/store.go | 179 + .../docker/cli/cli/manifest/types/types.go | 150 + .../docker/cli/cli/registry/client/client.go | 198 + .../cli/cli/registry/client/endpoint.go | 135 + .../docker/cli/cli/registry/client/fetcher.go | 323 + .../github.com/docker/cli/cli/streams/in.go | 61 + .../github.com/docker/cli/cli/streams/out.go | 58 + .../docker/cli/cli/streams/stream.go | 35 + .../github.com/docker/cli/cli/trust/trust.go | 378 + .../docker/cli/cli/version/version.go | 10 + .../docker/cli/opts/capabilities.go | 89 + vendor/github.com/docker/cli/opts/config.go | 99 + vendor/github.com/docker/cli/opts/duration.go | 64 + vendor/github.com/docker/cli/opts/env.go | 31 + vendor/github.com/docker/cli/opts/envfile.go | 22 + vendor/github.com/docker/cli/opts/file.go | 76 + vendor/github.com/docker/cli/opts/gpus.go | 111 + vendor/github.com/docker/cli/opts/hosts.go | 181 + .../github.com/docker/cli/opts/hosts_unix.go | 10 + .../docker/cli/opts/hosts_windows.go | 59 + vendor/github.com/docker/cli/opts/ip.go | 47 + vendor/github.com/docker/cli/opts/mount.go | 186 + vendor/github.com/docker/cli/opts/network.go | 127 + vendor/github.com/docker/cli/opts/opts.go | 513 + vendor/github.com/docker/cli/opts/parse.go | 91 + vendor/github.com/docker/cli/opts/port.go | 171 + .../docker/cli/opts/quotedstring.go | 40 + vendor/github.com/docker/cli/opts/secret.go | 98 + .../docker/cli/opts/throttledevice.go | 104 + vendor/github.com/docker/cli/opts/ulimit.go | 60 + .../docker/cli/opts/weightdevice.go | 84 + .../docker/distribution/.dockerignore | 1 + .../github.com/docker/distribution/.gitignore | 38 + .../docker/distribution/.golangci.yml | 27 + .../github.com/docker/distribution/.mailmap | 51 + .../docker/distribution/BUILDING.md | 117 + .../docker/distribution/CONTRIBUTING.md | 148 + .../github.com/docker/distribution/Dockerfile | 60 + vendor/github.com/docker/distribution/LICENSE | 202 + .../docker/distribution/MAINTAINERS | 243 + .../github.com/docker/distribution/Makefile | 102 + .../github.com/docker/distribution/README.md | 130 + .../github.com/docker/distribution/ROADMAP.md | 267 + .../github.com/docker/distribution/blobs.go | 265 + .../docker/distribution/digestset/set.go | 247 + vendor/github.com/docker/distribution/doc.go | 7 + .../docker/distribution/docker-bake.hcl | 56 + .../github.com/docker/distribution/errors.go | 119 + .../docker/distribution/manifest/doc.go | 1 + .../manifest/manifestlist/manifestlist.go | 239 + .../manifest/ocischema/builder.go | 107 + .../manifest/ocischema/manifest.go | 146 + .../distribution/manifest/schema2/builder.go | 85 + .../distribution/manifest/schema2/manifest.go | 144 + .../docker/distribution/manifest/versioned.go | 12 + .../docker/distribution/manifests.go | 125 + .../docker/distribution/metrics/prometheus.go | 13 + .../docker/distribution/reference/helpers.go | 42 + .../distribution/reference/normalize.go | 199 + .../distribution/reference/reference.go | 433 + .../docker/distribution/reference/regexp.go | 143 + .../docker/distribution/registry.go | 118 + .../registry/api/errcode/errors.go | 267 + .../registry/api/errcode/handler.go | 40 + .../registry/api/errcode/register.go | 138 + .../registry/api/v2/descriptors.go | 1613 ++ .../distribution/registry/api/v2/doc.go | 9 + .../distribution/registry/api/v2/errors.go | 145 + .../registry/api/v2/headerparser.go | 161 + .../distribution/registry/api/v2/routes.go | 40 + .../distribution/registry/api/v2/urls.go | 254 + .../registry/client/auth/api_version.go | 58 + .../registry/client/auth/challenge/addr.go | 27 + .../client/auth/challenge/authchallenge.go | 237 + .../registry/client/auth/session.go | 530 + .../registry/client/blob_writer.go | 162 + .../distribution/registry/client/errors.go | 141 + .../registry/client/repository.go | 870 ++ .../registry/client/transport/http_reader.go | 249 + .../registry/client/transport/transport.go | 147 + .../registry/storage/cache/cache.go | 35 + .../cache/cachedblobdescriptorstore.go | 129 + .../registry/storage/cache/memory/memory.go | 179 + vendor/github.com/docker/distribution/tags.go | 27 + .../docker/distribution/uuid/uuid.go | 126 + .../docker/distribution/vendor.conf | 51 + .../docker/docker-credential-helpers/LICENSE | 20 + .../client/client.go | 121 + .../client/command.go | 57 + .../credentials/credentials.go | 186 + .../credentials/error.go | 102 + .../credentials/helper.go | 14 + .../credentials/version.go | 4 + vendor/github.com/docker/docker/AUTHORS | 2390 +++ vendor/github.com/docker/docker/LICENSE | 191 + vendor/github.com/docker/docker/NOTICE | 19 + vendor/github.com/docker/docker/api/README.md | 42 + vendor/github.com/docker/docker/api/common.go | 11 + .../docker/docker/api/common_unix.go | 7 + .../docker/docker/api/common_windows.go | 8 + .../docker/docker/api/swagger-gen.yaml | 12 + .../github.com/docker/docker/api/swagger.yaml | 12145 ++++++++++++++++ .../docker/docker/api/types/auth.go | 7 + .../docker/docker/api/types/blkiodev/blkio.go | 23 + .../docker/docker/api/types/client.go | 444 + .../docker/docker/api/types/configs.go | 67 + .../container/change_response_deprecated.go | 6 + .../docker/api/types/container/change_type.go | 15 + .../api/types/container/change_types.go | 23 + .../docker/api/types/container/config.go | 96 + .../api/types/container/container_top.go | 22 + .../api/types/container/container_update.go | 16 + .../api/types/container/create_response.go | 19 + .../api/types/container/filesystem_change.go | 19 + .../docker/api/types/container/hostconfig.go | 456 + .../api/types/container/hostconfig_unix.go | 42 + .../api/types/container/hostconfig_windows.go | 40 + .../api/types/container/wait_exit_error.go | 12 + .../api/types/container/wait_response.go | 18 + .../api/types/container/waitcondition.go | 22 + .../docker/docker/api/types/error_response.go | 13 + .../docker/api/types/error_response_ext.go | 6 + .../docker/docker/api/types/events/events.go | 47 + .../docker/docker/api/types/filters/errors.go | 37 + .../docker/docker/api/types/filters/parse.go | 346 + .../docker/api/types/graph_driver_data.go | 23 + .../docker/docker/api/types/id_response.go | 13 + .../docker/api/types/image/image_history.go | 36 + .../docker/docker/api/types/image/opts.go | 9 + .../api/types/image_delete_response_item.go | 15 + .../docker/docker/api/types/image_summary.go | 94 + .../docker/docker/api/types/mount/mount.go | 140 + .../docker/api/types/network/network.go | 126 + .../docker/docker/api/types/plugin.go | 203 + .../docker/docker/api/types/plugin_device.go | 25 + .../docker/docker/api/types/plugin_env.go | 25 + .../docker/api/types/plugin_interface_type.go | 21 + .../docker/docker/api/types/plugin_mount.go | 37 + .../docker/api/types/plugin_responses.go | 71 + .../docker/docker/api/types/port.go | 23 + .../docker/api/types/registry/authconfig.go | 99 + .../docker/api/types/registry/authenticate.go | 21 + .../docker/api/types/registry/registry.go | 120 + .../api/types/service_update_response.go | 12 + .../docker/docker/api/types/stats.go | 181 + .../docker/api/types/strslice/strslice.go | 30 + .../docker/docker/api/types/swarm/common.go | 48 + .../docker/docker/api/types/swarm/config.go | 40 + .../docker/api/types/swarm/container.go | 80 + .../docker/docker/api/types/swarm/network.go | 121 + .../docker/docker/api/types/swarm/node.go | 139 + .../docker/docker/api/types/swarm/runtime.go | 27 + .../docker/api/types/swarm/runtime/gen.go | 3 + .../api/types/swarm/runtime/plugin.pb.go | 754 + .../api/types/swarm/runtime/plugin.proto | 21 + .../docker/docker/api/types/swarm/secret.go | 36 + .../docker/docker/api/types/swarm/service.go | 202 + .../docker/docker/api/types/swarm/swarm.go | 237 + .../docker/docker/api/types/swarm/task.go | 225 + .../docker/docker/api/types/time/timestamp.go | 131 + .../docker/docker/api/types/types.go | 811 ++ .../docker/api/types/versions/README.md | 14 + .../docker/api/types/versions/compare.go | 65 + .../docker/api/types/volume/cluster_volume.go | 420 + .../docker/api/types/volume/create_options.go | 29 + .../docker/api/types/volume/list_response.go | 18 + .../docker/docker/api/types/volume/options.go | 8 + .../docker/docker/api/types/volume/volume.go | 75 + .../docker/api/types/volume/volume_update.go | 7 + .../github.com/docker/docker/client/README.md | 35 + .../docker/docker/client/build_cancel.go | 16 + .../docker/docker/client/build_prune.go | 45 + .../docker/docker/client/checkpoint_create.go | 14 + .../docker/docker/client/checkpoint_delete.go | 20 + .../docker/docker/client/checkpoint_list.go | 28 + .../github.com/docker/docker/client/client.go | 354 + .../docker/docker/client/client_deprecated.go | 27 + .../docker/docker/client/client_unix.go | 8 + .../docker/docker/client/client_windows.go | 5 + .../docker/docker/client/config_create.go | 25 + .../docker/docker/client/config_inspect.go | 36 + .../docker/docker/client/config_list.go | 38 + .../docker/docker/client/config_remove.go | 13 + .../docker/docker/client/config_update.go | 20 + .../docker/docker/client/container_attach.go | 59 + .../docker/docker/client/container_commit.go | 55 + .../docker/docker/client/container_copy.go | 93 + .../docker/docker/client/container_create.go | 83 + .../docker/docker/client/container_diff.go | 23 + .../docker/docker/client/container_exec.go | 66 + .../docker/docker/client/container_export.go | 19 + .../docker/docker/client/container_inspect.go | 53 + .../docker/docker/client/container_kill.go | 18 + .../docker/docker/client/container_list.go | 57 + .../docker/docker/client/container_logs.go | 80 + .../docker/docker/client/container_pause.go | 10 + .../docker/docker/client/container_prune.go | 36 + .../docker/docker/client/container_remove.go | 27 + .../docker/docker/client/container_rename.go | 15 + .../docker/docker/client/container_resize.go | 29 + .../docker/docker/client/container_restart.go | 26 + .../docker/docker/client/container_start.go | 23 + .../docker/docker/client/container_stats.go | 42 + .../docker/docker/client/container_stop.go | 30 + .../docker/docker/client/container_top.go | 28 + .../docker/docker/client/container_unpause.go | 10 + .../docker/docker/client/container_update.go | 21 + .../docker/docker/client/container_wait.go | 104 + .../docker/docker/client/disk_usage.go | 33 + .../docker/client/distribution_inspect.go | 38 + .../docker/docker/client/envvars.go | 90 + .../github.com/docker/docker/client/errors.go | 68 + .../github.com/docker/docker/client/events.go | 101 + .../github.com/docker/docker/client/hijack.go | 148 + .../docker/docker/client/image_build.go | 146 + .../docker/docker/client/image_create.go | 38 + .../docker/docker/client/image_history.go | 22 + .../docker/docker/client/image_import.go | 40 + .../docker/docker/client/image_inspect.go | 32 + .../docker/docker/client/image_list.go | 49 + .../docker/docker/client/image_load.go | 29 + .../docker/docker/client/image_prune.go | 36 + .../docker/docker/client/image_pull.go | 64 + .../docker/docker/client/image_push.go | 55 + .../docker/docker/client/image_remove.go | 31 + .../docker/docker/client/image_save.go | 21 + .../docker/docker/client/image_search.go | 53 + .../docker/docker/client/image_tag.go | 37 + .../github.com/docker/docker/client/info.go | 26 + .../docker/docker/client/interface.go | 201 + .../docker/client/interface_experimental.go | 18 + .../docker/docker/client/interface_stable.go | 10 + .../github.com/docker/docker/client/login.go | 24 + .../docker/docker/client/network_connect.go | 19 + .../docker/docker/client/network_create.go | 25 + .../docker/client/network_disconnect.go | 15 + .../docker/docker/client/network_inspect.go | 49 + .../docker/docker/client/network_list.go | 32 + .../docker/docker/client/network_prune.go | 36 + .../docker/docker/client/network_remove.go | 10 + .../docker/docker/client/node_inspect.go | 32 + .../docker/docker/client/node_list.go | 36 + .../docker/docker/client/node_remove.go | 20 + .../docker/docker/client/node_update.go | 17 + .../docker/docker/client/options.go | 210 + .../github.com/docker/docker/client/ping.go | 75 + .../docker/docker/client/plugin_create.go | 23 + .../docker/docker/client/plugin_disable.go | 19 + .../docker/docker/client/plugin_enable.go | 19 + .../docker/docker/client/plugin_inspect.go | 31 + .../docker/docker/client/plugin_install.go | 114 + .../docker/docker/client/plugin_list.go | 33 + .../docker/docker/client/plugin_push.go | 18 + .../docker/docker/client/plugin_remove.go | 20 + .../docker/docker/client/plugin_set.go | 12 + .../docker/docker/client/plugin_upgrade.go | 40 + .../docker/docker/client/request.go | 275 + .../docker/docker/client/secret_create.go | 25 + .../docker/docker/client/secret_inspect.go | 36 + .../docker/docker/client/secret_list.go | 38 + .../docker/docker/client/secret_remove.go | 13 + .../docker/docker/client/secret_update.go | 20 + .../docker/docker/client/service_create.go | 179 + .../docker/docker/client/service_inspect.go | 37 + .../docker/docker/client/service_list.go | 39 + .../docker/docker/client/service_logs.go | 52 + .../docker/docker/client/service_remove.go | 10 + .../docker/docker/client/service_update.go | 75 + .../docker/client/swarm_get_unlock_key.go | 21 + .../docker/docker/client/swarm_init.go | 21 + .../docker/docker/client/swarm_inspect.go | 21 + .../docker/docker/client/swarm_join.go | 14 + .../docker/docker/client/swarm_leave.go | 17 + .../docker/docker/client/swarm_unlock.go | 14 + .../docker/docker/client/swarm_update.go | 21 + .../docker/docker/client/task_inspect.go | 32 + .../docker/docker/client/task_list.go | 35 + .../docker/docker/client/task_logs.go | 51 + .../docker/docker/client/transport.go | 17 + .../github.com/docker/docker/client/utils.go | 34 + .../docker/docker/client/version.go | 21 + .../docker/docker/client/volume_create.go | 20 + .../docker/docker/client/volume_inspect.go | 38 + .../docker/docker/client/volume_list.go | 33 + .../docker/docker/client/volume_prune.go | 36 + .../docker/docker/client/volume_remove.go | 21 + .../docker/docker/client/volume_update.go | 24 + .../github.com/docker/docker/errdefs/defs.go | 69 + .../github.com/docker/docker/errdefs/doc.go | 8 + .../docker/docker/errdefs/helpers.go | 279 + .../docker/docker/errdefs/http_helpers.go | 46 + vendor/github.com/docker/docker/errdefs/is.go | 107 + .../docker/pkg/homedir/homedir_linux.go | 105 + .../docker/pkg/homedir/homedir_others.go | 33 + .../docker/docker/pkg/homedir/homedir_unix.go | 39 + .../docker/pkg/homedir/homedir_windows.go | 24 + .../docker/docker/pkg/ioutils/buffer.go | 51 + .../docker/docker/pkg/ioutils/bytespipe.go | 187 + .../docker/docker/pkg/ioutils/fswriters.go | 161 + .../docker/docker/pkg/ioutils/readers.go | 151 + .../docker/pkg/ioutils/tempdir_deprecated.go | 10 + .../docker/docker/pkg/ioutils/writeflusher.go | 92 + .../docker/docker/pkg/ioutils/writers.go | 66 + .../docker/pkg/jsonmessage/jsonmessage.go | 307 + .../docker/docker/pkg/longpath/longpath.go | 43 + .../github.com/docker/docker/registry/auth.go | 196 + .../docker/docker/registry/config.go | 448 + .../docker/docker/registry/config_unix.go | 17 + .../docker/docker/registry/config_windows.go | 20 + .../docker/docker/registry/endpoint_v1.go | 185 + .../docker/docker/registry/errors.go | 36 + .../docker/docker/registry/registry.go | 180 + .../docker/docker/registry/search.go | 139 + .../docker/docker/registry/service.go | 167 + .../docker/docker/registry/service_v2.go | 80 + .../docker/docker/registry/session.go | 216 + .../docker/docker/registry/types.go | 39 + .../github.com/docker/go-connections/LICENSE | 191 + .../docker/go-connections/nat/nat.go | 242 + .../docker/go-connections/nat/parse.go | 57 + .../docker/go-connections/nat/sort.go | 96 + .../docker/go-connections/sockets/README.md | 0 .../go-connections/sockets/inmem_socket.go | 81 + .../docker/go-connections/sockets/proxy.go | 51 + .../docker/go-connections/sockets/sockets.go | 38 + .../go-connections/sockets/sockets_unix.go | 35 + .../go-connections/sockets/sockets_windows.go | 27 + .../go-connections/sockets/tcp_socket.go | 22 + .../go-connections/sockets/unix_socket.go | 32 + .../go-connections/tlsconfig/certpool_go17.go | 18 + .../tlsconfig/certpool_other.go | 13 + .../docker/go-connections/tlsconfig/config.go | 254 + .../tlsconfig/config_client_ciphers.go | 17 + .../tlsconfig/config_legacy_client_ciphers.go | 15 + .../docker/go-metrics/CONTRIBUTING.md | 55 + vendor/github.com/docker/go-metrics/LICENSE | 191 + .../github.com/docker/go-metrics/LICENSE.docs | 425 + vendor/github.com/docker/go-metrics/NOTICE | 16 + vendor/github.com/docker/go-metrics/README.md | 91 + .../github.com/docker/go-metrics/counter.go | 52 + vendor/github.com/docker/go-metrics/docs.go | 3 + vendor/github.com/docker/go-metrics/gauge.go | 72 + .../github.com/docker/go-metrics/handler.go | 74 + .../github.com/docker/go-metrics/helpers.go | 10 + .../github.com/docker/go-metrics/namespace.go | 315 + .../github.com/docker/go-metrics/register.go | 15 + vendor/github.com/docker/go-metrics/timer.go | 85 + vendor/github.com/docker/go-metrics/unit.go | 12 + .../docker/go-units/CONTRIBUTING.md | 67 + vendor/github.com/docker/go-units/LICENSE | 191 + vendor/github.com/docker/go-units/MAINTAINERS | 46 + vendor/github.com/docker/go-units/README.md | 16 + vendor/github.com/docker/go-units/circle.yml | 11 + vendor/github.com/docker/go-units/duration.go | 35 + vendor/github.com/docker/go-units/size.go | 108 + vendor/github.com/docker/go-units/ulimit.go | 123 + vendor/github.com/docker/go/LICENSE | 27 + .../docker/go/canonical/json/decode.go | 1168 ++ .../docker/go/canonical/json/encode.go | 1250 ++ .../docker/go/canonical/json/fold.go | 143 + .../docker/go/canonical/json/indent.go | 141 + .../docker/go/canonical/json/scanner.go | 623 + .../docker/go/canonical/json/stream.go | 487 + .../docker/go/canonical/json/tags.go | 44 + .../github.com/fvbommel/sortorder/.gitignore | 19 + vendor/github.com/fvbommel/sortorder/LICENSE | 17 + .../github.com/fvbommel/sortorder/README.md | 5 + vendor/github.com/fvbommel/sortorder/doc.go | 5 + .../github.com/fvbommel/sortorder/natsort.go | 76 + vendor/github.com/gogo/protobuf/AUTHORS | 15 + vendor/github.com/gogo/protobuf/CONTRIBUTORS | 23 + vendor/github.com/gogo/protobuf/LICENSE | 35 + .../github.com/gogo/protobuf/proto/Makefile | 43 + .../github.com/gogo/protobuf/proto/clone.go | 258 + .../gogo/protobuf/proto/custom_gogo.go | 39 + .../github.com/gogo/protobuf/proto/decode.go | 427 + .../gogo/protobuf/proto/deprecated.go | 63 + .../github.com/gogo/protobuf/proto/discard.go | 350 + .../gogo/protobuf/proto/duration.go | 100 + .../gogo/protobuf/proto/duration_gogo.go | 49 + .../github.com/gogo/protobuf/proto/encode.go | 205 + .../gogo/protobuf/proto/encode_gogo.go | 33 + .../github.com/gogo/protobuf/proto/equal.go | 300 + .../gogo/protobuf/proto/extensions.go | 605 + .../gogo/protobuf/proto/extensions_gogo.go | 389 + vendor/github.com/gogo/protobuf/proto/lib.go | 973 ++ .../gogo/protobuf/proto/lib_gogo.go | 50 + .../gogo/protobuf/proto/message_set.go | 181 + .../gogo/protobuf/proto/pointer_reflect.go | 357 + .../protobuf/proto/pointer_reflect_gogo.go | 59 + .../gogo/protobuf/proto/pointer_unsafe.go | 308 + .../protobuf/proto/pointer_unsafe_gogo.go | 56 + .../gogo/protobuf/proto/properties.go | 610 + .../gogo/protobuf/proto/properties_gogo.go | 36 + .../gogo/protobuf/proto/skip_gogo.go | 119 + .../gogo/protobuf/proto/table_marshal.go | 3009 ++++ .../gogo/protobuf/proto/table_marshal_gogo.go | 388 + .../gogo/protobuf/proto/table_merge.go | 676 + .../gogo/protobuf/proto/table_unmarshal.go | 2249 +++ .../protobuf/proto/table_unmarshal_gogo.go | 385 + vendor/github.com/gogo/protobuf/proto/text.go | 930 ++ .../gogo/protobuf/proto/text_gogo.go | 57 + .../gogo/protobuf/proto/text_parser.go | 1018 ++ .../gogo/protobuf/proto/timestamp.go | 113 + .../gogo/protobuf/proto/timestamp_gogo.go | 49 + .../gogo/protobuf/proto/wrappers.go | 1888 +++ .../gogo/protobuf/proto/wrappers_gogo.go | 113 + vendor/github.com/golang/protobuf/AUTHORS | 3 + .../github.com/golang/protobuf/CONTRIBUTORS | 3 + vendor/github.com/golang/protobuf/LICENSE | 28 + .../golang/protobuf/proto/buffer.go | 324 + .../golang/protobuf/proto/defaults.go | 63 + .../golang/protobuf/proto/deprecated.go | 113 + .../golang/protobuf/proto/discard.go | 58 + .../golang/protobuf/proto/extensions.go | 356 + .../golang/protobuf/proto/properties.go | 306 + .../github.com/golang/protobuf/proto/proto.go | 167 + .../golang/protobuf/proto/registry.go | 317 + .../golang/protobuf/proto/text_decode.go | 801 + .../golang/protobuf/proto/text_encode.go | 560 + .../github.com/golang/protobuf/proto/wire.go | 78 + .../golang/protobuf/proto/wrappers.go | 34 + .../github.com/golang/protobuf/ptypes/any.go | 179 + .../golang/protobuf/ptypes/any/any.pb.go | 62 + .../github.com/golang/protobuf/ptypes/doc.go | 10 + .../golang/protobuf/ptypes/duration.go | 76 + .../protobuf/ptypes/duration/duration.pb.go | 63 + .../golang/protobuf/ptypes/timestamp.go | 112 + .../protobuf/ptypes/timestamp/timestamp.pb.go | 64 + vendor/github.com/gorilla/mux/AUTHORS | 8 + vendor/github.com/gorilla/mux/LICENSE | 27 + vendor/github.com/gorilla/mux/README.md | 805 + vendor/github.com/gorilla/mux/doc.go | 306 + vendor/github.com/gorilla/mux/middleware.go | 74 + vendor/github.com/gorilla/mux/mux.go | 606 + vendor/github.com/gorilla/mux/regexp.go | 388 + vendor/github.com/gorilla/mux/route.go | 736 + vendor/github.com/gorilla/mux/test_helpers.go | 19 + .../inconshreveable/mousetrap/LICENSE | 13 + .../inconshreveable/mousetrap/README.md | 23 + .../inconshreveable/mousetrap/trap_others.go | 15 + .../inconshreveable/mousetrap/trap_windows.go | 98 + .../mousetrap/trap_windows_1.4.go | 46 + vendor/github.com/mattn/go-colorable/LICENSE | 21 + .../github.com/mattn/go-colorable/README.md | 48 + .../mattn/go-colorable/colorable_appengine.go | 38 + .../mattn/go-colorable/colorable_others.go | 38 + .../mattn/go-colorable/colorable_windows.go | 1047 ++ .../github.com/mattn/go-colorable/go.test.sh | 12 + .../mattn/go-colorable/noncolorable.go | 57 + vendor/github.com/mattn/go-isatty/LICENSE | 9 + vendor/github.com/mattn/go-isatty/README.md | 50 + vendor/github.com/mattn/go-isatty/doc.go | 2 + vendor/github.com/mattn/go-isatty/go.test.sh | 12 + .../github.com/mattn/go-isatty/isatty_bsd.go | 19 + .../mattn/go-isatty/isatty_others.go | 16 + .../mattn/go-isatty/isatty_plan9.go | 23 + .../mattn/go-isatty/isatty_solaris.go | 21 + .../mattn/go-isatty/isatty_tcgets.go | 19 + .../mattn/go-isatty/isatty_windows.go | 125 + .../golang_protobuf_extensions/LICENSE | 201 + .../golang_protobuf_extensions/NOTICE | 1 + .../pbutil/.gitignore | 1 + .../pbutil/Makefile | 7 + .../pbutil/decode.go | 75 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + vendor/github.com/miekg/pkcs11/.gitignore | 3 + vendor/github.com/miekg/pkcs11/.travis.yml | 14 + vendor/github.com/miekg/pkcs11/LICENSE | 27 + .../github.com/miekg/pkcs11/Makefile.release | 57 + vendor/github.com/miekg/pkcs11/README.md | 68 + vendor/github.com/miekg/pkcs11/const.go | 736 + vendor/github.com/miekg/pkcs11/error.go | 98 + vendor/github.com/miekg/pkcs11/hsm.db | Bin 0 -> 10240 bytes vendor/github.com/miekg/pkcs11/params.go | 190 + vendor/github.com/miekg/pkcs11/pkcs11.go | 1606 ++ vendor/github.com/miekg/pkcs11/pkcs11.h | 265 + vendor/github.com/miekg/pkcs11/pkcs11f.h | 939 ++ vendor/github.com/miekg/pkcs11/pkcs11go.h | 33 + vendor/github.com/miekg/pkcs11/pkcs11t.h | 2047 +++ vendor/github.com/miekg/pkcs11/release.go | 17 + vendor/github.com/miekg/pkcs11/softhsm.conf | 1 + vendor/github.com/miekg/pkcs11/softhsm2.conf | 4 + vendor/github.com/miekg/pkcs11/types.go | 303 + vendor/github.com/miekg/pkcs11/vendor.go | 127 + .../mitchellh/mapstructure/CHANGELOG.md | 96 + .../github.com/mitchellh/mapstructure/LICENSE | 21 + .../mitchellh/mapstructure/README.md | 46 + .../mitchellh/mapstructure/decode_hooks.go | 279 + .../mitchellh/mapstructure/error.go | 50 + .../mitchellh/mapstructure/mapstructure.go | 1540 ++ vendor/github.com/moby/sys/sequential/LICENSE | 202 + vendor/github.com/moby/sys/sequential/doc.go | 15 + .../moby/sys/sequential/sequential_unix.go | 45 + .../moby/sys/sequential/sequential_windows.go | 161 + vendor/github.com/moby/term/.gitignore | 8 + vendor/github.com/moby/term/LICENSE | 191 + vendor/github.com/moby/term/README.md | 36 + vendor/github.com/moby/term/ascii.go | 66 + vendor/github.com/moby/term/proxy.go | 88 + vendor/github.com/moby/term/tc.go | 19 + vendor/github.com/moby/term/term.go | 120 + vendor/github.com/moby/term/term_windows.go | 231 + vendor/github.com/moby/term/termios.go | 35 + vendor/github.com/moby/term/termios_bsd.go | 12 + vendor/github.com/moby/term/termios_nonbsd.go | 12 + .../moby/term/windows/ansi_reader.go | 252 + .../moby/term/windows/ansi_writer.go | 56 + .../github.com/moby/term/windows/console.go | 39 + vendor/github.com/moby/term/windows/doc.go | 5 + vendor/github.com/moby/term/winsize.go | 20 + vendor/github.com/morikuni/aec/LICENSE | 21 + vendor/github.com/morikuni/aec/README.md | 178 + vendor/github.com/morikuni/aec/aec.go | 137 + vendor/github.com/morikuni/aec/ansi.go | 59 + vendor/github.com/morikuni/aec/builder.go | 388 + vendor/github.com/morikuni/aec/sample.gif | Bin 0 -> 12548 bytes vendor/github.com/morikuni/aec/sgr.go | 202 + .../opencontainers/go-digest/.mailmap | 4 + .../opencontainers/go-digest/.pullapprove.yml | 28 + .../opencontainers/go-digest/.travis.yml | 5 + .../opencontainers/go-digest/CONTRIBUTING.md | 72 + .../opencontainers/go-digest/LICENSE | 192 + .../opencontainers/go-digest/LICENSE.docs | 425 + .../opencontainers/go-digest/MAINTAINERS | 5 + .../opencontainers/go-digest/README.md | 96 + .../opencontainers/go-digest/algorithm.go | 193 + .../opencontainers/go-digest/digest.go | 157 + .../opencontainers/go-digest/digester.go | 40 + .../opencontainers/go-digest/digestset/set.go | 262 + .../opencontainers/go-digest/doc.go | 62 + .../opencontainers/go-digest/verifiers.go | 46 + .../opencontainers/image-spec/LICENSE | 191 + .../image-spec/specs-go/v1/annotations.go | 56 + .../image-spec/specs-go/v1/config.go | 103 + .../image-spec/specs-go/v1/descriptor.go | 64 + .../image-spec/specs-go/v1/index.go | 32 + .../image-spec/specs-go/v1/layout.go | 28 + .../image-spec/specs-go/v1/manifest.go | 35 + .../image-spec/specs-go/v1/mediatype.go | 48 + .../image-spec/specs-go/version.go | 32 + .../image-spec/specs-go/versioned.go | 23 + vendor/github.com/pkg/errors/.gitignore | 24 + vendor/github.com/pkg/errors/.travis.yml | 10 + vendor/github.com/pkg/errors/LICENSE | 23 + vendor/github.com/pkg/errors/Makefile | 44 + vendor/github.com/pkg/errors/README.md | 59 + vendor/github.com/pkg/errors/appveyor.yml | 32 + vendor/github.com/pkg/errors/errors.go | 288 + vendor/github.com/pkg/errors/go113.go | 38 + vendor/github.com/pkg/errors/stack.go | 177 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../client_golang/prometheus/.gitignore | 1 + .../client_golang/prometheus/README.md | 1 + .../client_golang/prometheus/collector.go | 120 + .../client_golang/prometheus/counter.go | 321 + .../client_golang/prometheus/desc.go | 186 + .../client_golang/prometheus/doc.go | 199 + .../prometheus/expvar_collector.go | 86 + .../client_golang/prometheus/fnv.go | 42 + .../client_golang/prometheus/gauge.go | 289 + .../client_golang/prometheus/go_collector.go | 367 + .../client_golang/prometheus/histogram.go | 642 + .../prometheus/internal/metric.go | 85 + .../client_golang/prometheus/labels.go | 87 + .../client_golang/prometheus/metric.go | 176 + .../client_golang/prometheus/observer.go | 64 + .../prometheus/process_collector.go | 166 + .../prometheus/process_collector_other.go | 65 + .../prometheus/process_collector_windows.go | 116 + .../prometheus/promhttp/delegator.go | 368 + .../client_golang/prometheus/promhttp/http.go | 383 + .../prometheus/promhttp/instrument_client.go | 235 + .../prometheus/promhttp/instrument_server.go | 517 + .../prometheus/promhttp/option.go | 31 + .../client_golang/prometheus/registry.go | 950 ++ .../client_golang/prometheus/summary.go | 744 + .../client_golang/prometheus/timer.go | 54 + .../client_golang/prometheus/untyped.go | 42 + .../client_golang/prometheus/value.go | 212 + .../client_golang/prometheus/vec.go | 556 + .../client_golang/prometheus/wrap.go | 214 + .../prometheus/client_model/LICENSE | 201 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 723 + vendor/github.com/prometheus/common/LICENSE | 201 + vendor/github.com/prometheus/common/NOTICE | 5 + .../prometheus/common/expfmt/decode.go | 429 + .../prometheus/common/expfmt/encode.go | 162 + .../prometheus/common/expfmt/expfmt.go | 41 + .../prometheus/common/expfmt/fuzz.go | 36 + .../common/expfmt/openmetrics_create.go | 527 + .../prometheus/common/expfmt/text_create.go | 465 + .../prometheus/common/expfmt/text_parse.go | 775 + .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 218 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 102 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/time.go | 317 + .../prometheus/common/model/value.go | 416 + .../github.com/prometheus/procfs/.gitignore | 1 + .../prometheus/procfs/.golangci.yml | 4 + .../prometheus/procfs/CODE_OF_CONDUCT.md | 3 + .../prometheus/procfs/CONTRIBUTING.md | 121 + vendor/github.com/prometheus/procfs/LICENSE | 201 + .../prometheus/procfs/MAINTAINERS.md | 2 + vendor/github.com/prometheus/procfs/Makefile | 29 + .../prometheus/procfs/Makefile.common | 302 + vendor/github.com/prometheus/procfs/NOTICE | 7 + vendor/github.com/prometheus/procfs/README.md | 61 + .../github.com/prometheus/procfs/SECURITY.md | 6 + vendor/github.com/prometheus/procfs/arp.go | 85 + .../github.com/prometheus/procfs/buddyinfo.go | 85 + .../github.com/prometheus/procfs/cpuinfo.go | 481 + .../prometheus/procfs/cpuinfo_armx.go | 19 + .../prometheus/procfs/cpuinfo_mipsx.go | 19 + .../prometheus/procfs/cpuinfo_others.go | 19 + .../prometheus/procfs/cpuinfo_ppcx.go | 19 + .../prometheus/procfs/cpuinfo_riscvx.go | 19 + .../prometheus/procfs/cpuinfo_s390x.go | 18 + .../prometheus/procfs/cpuinfo_x86.go | 19 + vendor/github.com/prometheus/procfs/crypto.go | 153 + vendor/github.com/prometheus/procfs/doc.go | 45 + .../prometheus/procfs/fixtures.ttar | 6553 +++++++++ vendor/github.com/prometheus/procfs/fs.go | 43 + .../github.com/prometheus/procfs/fscache.go | 422 + .../prometheus/procfs/internal/fs/fs.go | 55 + .../prometheus/procfs/internal/util/parse.go | 97 + .../procfs/internal/util/readfile.go | 38 + .../procfs/internal/util/sysreadfile.go | 48 + .../internal/util/sysreadfile_compat.go | 26 + .../procfs/internal/util/valueparser.go | 91 + vendor/github.com/prometheus/procfs/ipvs.go | 241 + .../prometheus/procfs/kernel_random.go | 62 + .../github.com/prometheus/procfs/loadavg.go | 62 + vendor/github.com/prometheus/procfs/mdstat.go | 213 + .../github.com/prometheus/procfs/meminfo.go | 277 + .../github.com/prometheus/procfs/mountinfo.go | 180 + .../prometheus/procfs/mountstats.go | 638 + .../prometheus/procfs/net_conntrackstat.go | 153 + .../github.com/prometheus/procfs/net_dev.go | 205 + .../prometheus/procfs/net_ip_socket.go | 220 + .../prometheus/procfs/net_protocols.go | 180 + .../prometheus/procfs/net_sockstat.go | 163 + .../prometheus/procfs/net_softnet.go | 102 + .../github.com/prometheus/procfs/net_tcp.go | 64 + .../github.com/prometheus/procfs/net_udp.go | 64 + .../github.com/prometheus/procfs/net_unix.go | 257 + vendor/github.com/prometheus/procfs/proc.go | 319 + .../prometheus/procfs/proc_cgroup.go | 98 + .../prometheus/procfs/proc_environ.go | 37 + .../prometheus/procfs/proc_fdinfo.go | 133 + .../github.com/prometheus/procfs/proc_io.go | 59 + .../prometheus/procfs/proc_limits.go | 160 + .../github.com/prometheus/procfs/proc_maps.go | 209 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../github.com/prometheus/procfs/proc_psi.go | 100 + .../prometheus/procfs/proc_smaps.go | 165 + .../github.com/prometheus/procfs/proc_stat.go | 189 + .../prometheus/procfs/proc_status.go | 170 + .../github.com/prometheus/procfs/schedstat.go | 121 + vendor/github.com/prometheus/procfs/slab.go | 151 + vendor/github.com/prometheus/procfs/stat.go | 244 + vendor/github.com/prometheus/procfs/swaps.go | 89 + vendor/github.com/prometheus/procfs/ttar | 413 + vendor/github.com/prometheus/procfs/vm.go | 210 + vendor/github.com/prometheus/procfs/xfrm.go | 186 + .../github.com/prometheus/procfs/zoneinfo.go | 196 + vendor/github.com/robfig/cron/v3/.gitignore | 22 + vendor/github.com/robfig/cron/v3/.travis.yml | 1 + vendor/github.com/robfig/cron/v3/LICENSE | 21 + vendor/github.com/robfig/cron/v3/README.md | 125 + vendor/github.com/robfig/cron/v3/chain.go | 92 + .../robfig/cron/v3/constantdelay.go | 27 + vendor/github.com/robfig/cron/v3/cron.go | 355 + vendor/github.com/robfig/cron/v3/doc.go | 231 + vendor/github.com/robfig/cron/v3/logger.go | 86 + vendor/github.com/robfig/cron/v3/option.go | 45 + vendor/github.com/robfig/cron/v3/parser.go | 434 + vendor/github.com/robfig/cron/v3/spec.go | 188 + vendor/github.com/rs/zerolog/.gitignore | 25 + vendor/github.com/rs/zerolog/CNAME | 1 + vendor/github.com/rs/zerolog/LICENSE | 21 + vendor/github.com/rs/zerolog/README.md | 786 + vendor/github.com/rs/zerolog/_config.yml | 1 + vendor/github.com/rs/zerolog/array.go | 240 + vendor/github.com/rs/zerolog/console.go | 469 + vendor/github.com/rs/zerolog/context.go | 474 + vendor/github.com/rs/zerolog/ctx.go | 52 + vendor/github.com/rs/zerolog/encoder.go | 56 + vendor/github.com/rs/zerolog/encoder_cbor.go | 45 + vendor/github.com/rs/zerolog/encoder_json.go | 51 + vendor/github.com/rs/zerolog/event.go | 830 ++ vendor/github.com/rs/zerolog/example.jsonl | 7 + vendor/github.com/rs/zerolog/fields.go | 292 + vendor/github.com/rs/zerolog/globals.go | 170 + vendor/github.com/rs/zerolog/go112.go | 7 + vendor/github.com/rs/zerolog/hook.go | 64 + .../rs/zerolog/internal/cbor/README.md | 56 + .../rs/zerolog/internal/cbor/base.go | 19 + .../rs/zerolog/internal/cbor/cbor.go | 102 + .../rs/zerolog/internal/cbor/decode_stream.go | 654 + .../rs/zerolog/internal/cbor/string.go | 117 + .../rs/zerolog/internal/cbor/time.go | 93 + .../rs/zerolog/internal/cbor/types.go | 486 + .../rs/zerolog/internal/json/base.go | 19 + .../rs/zerolog/internal/json/bytes.go | 85 + .../rs/zerolog/internal/json/string.go | 149 + .../rs/zerolog/internal/json/time.go | 113 + .../rs/zerolog/internal/json/types.go | 414 + vendor/github.com/rs/zerolog/log.go | 518 + vendor/github.com/rs/zerolog/log/log.go | 131 + vendor/github.com/rs/zerolog/not_go112.go | 5 + vendor/github.com/rs/zerolog/pretty.png | Bin 0 -> 118839 bytes vendor/github.com/rs/zerolog/sampler.go | 134 + vendor/github.com/rs/zerolog/syslog.go | 89 + vendor/github.com/rs/zerolog/writer.go | 346 + vendor/github.com/sirupsen/logrus/.gitignore | 4 + .../github.com/sirupsen/logrus/.golangci.yml | 40 + vendor/github.com/sirupsen/logrus/.travis.yml | 15 + .../github.com/sirupsen/logrus/CHANGELOG.md | 259 + vendor/github.com/sirupsen/logrus/LICENSE | 21 + vendor/github.com/sirupsen/logrus/README.md | 513 + vendor/github.com/sirupsen/logrus/alt_exit.go | 76 + .../github.com/sirupsen/logrus/appveyor.yml | 14 + .../github.com/sirupsen/logrus/buffer_pool.go | 52 + vendor/github.com/sirupsen/logrus/doc.go | 26 + vendor/github.com/sirupsen/logrus/entry.go | 431 + vendor/github.com/sirupsen/logrus/exported.go | 270 + .../github.com/sirupsen/logrus/formatter.go | 78 + vendor/github.com/sirupsen/logrus/hooks.go | 34 + .../sirupsen/logrus/json_formatter.go | 128 + vendor/github.com/sirupsen/logrus/logger.go | 404 + vendor/github.com/sirupsen/logrus/logrus.go | 186 + .../logrus/terminal_check_appengine.go | 11 + .../sirupsen/logrus/terminal_check_bsd.go | 13 + .../sirupsen/logrus/terminal_check_js.go | 7 + .../logrus/terminal_check_no_terminal.go | 11 + .../logrus/terminal_check_notappengine.go | 17 + .../sirupsen/logrus/terminal_check_solaris.go | 11 + .../sirupsen/logrus/terminal_check_unix.go | 13 + .../sirupsen/logrus/terminal_check_windows.go | 27 + .../sirupsen/logrus/text_formatter.go | 339 + vendor/github.com/sirupsen/logrus/writer.go | 70 + vendor/github.com/spf13/cobra/.gitignore | 39 + vendor/github.com/spf13/cobra/.golangci.yml | 48 + vendor/github.com/spf13/cobra/.mailmap | 3 + vendor/github.com/spf13/cobra/CHANGELOG.md | 51 + vendor/github.com/spf13/cobra/CONDUCT.md | 37 + vendor/github.com/spf13/cobra/CONTRIBUTING.md | 50 + vendor/github.com/spf13/cobra/LICENSE.txt | 174 + vendor/github.com/spf13/cobra/Makefile | 40 + vendor/github.com/spf13/cobra/README.md | 125 + vendor/github.com/spf13/cobra/args.go | 109 + .../spf13/cobra/bash_completions.go | 685 + .../spf13/cobra/bash_completions.md | 93 + .../spf13/cobra/bash_completionsV2.go | 302 + vendor/github.com/spf13/cobra/cobra.go | 222 + vendor/github.com/spf13/cobra/command.go | 1680 +++ .../github.com/spf13/cobra/command_notwin.go | 5 + vendor/github.com/spf13/cobra/command_win.go | 26 + vendor/github.com/spf13/cobra/completions.go | 781 + .../spf13/cobra/fish_completions.go | 219 + .../spf13/cobra/fish_completions.md | 4 + .../spf13/cobra/powershell_completions.go | 285 + .../spf13/cobra/powershell_completions.md | 3 + .../spf13/cobra/projects_using_cobra.md | 38 + .../spf13/cobra/shell_completions.go | 84 + .../spf13/cobra/shell_completions.md | 546 + vendor/github.com/spf13/cobra/user_guide.md | 637 + .../github.com/spf13/cobra/zsh_completions.go | 258 + .../github.com/spf13/cobra/zsh_completions.md | 48 + vendor/github.com/spf13/pflag/.gitignore | 2 + vendor/github.com/spf13/pflag/.travis.yml | 22 + vendor/github.com/spf13/pflag/LICENSE | 28 + vendor/github.com/spf13/pflag/README.md | 296 + vendor/github.com/spf13/pflag/bool.go | 94 + vendor/github.com/spf13/pflag/bool_slice.go | 185 + vendor/github.com/spf13/pflag/bytes.go | 209 + vendor/github.com/spf13/pflag/count.go | 96 + vendor/github.com/spf13/pflag/duration.go | 86 + .../github.com/spf13/pflag/duration_slice.go | 166 + vendor/github.com/spf13/pflag/flag.go | 1239 ++ vendor/github.com/spf13/pflag/float32.go | 88 + .../github.com/spf13/pflag/float32_slice.go | 174 + vendor/github.com/spf13/pflag/float64.go | 84 + .../github.com/spf13/pflag/float64_slice.go | 166 + vendor/github.com/spf13/pflag/golangflag.go | 105 + vendor/github.com/spf13/pflag/int.go | 84 + vendor/github.com/spf13/pflag/int16.go | 88 + vendor/github.com/spf13/pflag/int32.go | 88 + vendor/github.com/spf13/pflag/int32_slice.go | 174 + vendor/github.com/spf13/pflag/int64.go | 84 + vendor/github.com/spf13/pflag/int64_slice.go | 166 + vendor/github.com/spf13/pflag/int8.go | 88 + vendor/github.com/spf13/pflag/int_slice.go | 158 + vendor/github.com/spf13/pflag/ip.go | 94 + vendor/github.com/spf13/pflag/ip_slice.go | 186 + vendor/github.com/spf13/pflag/ipmask.go | 122 + vendor/github.com/spf13/pflag/ipnet.go | 98 + vendor/github.com/spf13/pflag/string.go | 80 + vendor/github.com/spf13/pflag/string_array.go | 129 + vendor/github.com/spf13/pflag/string_slice.go | 163 + .../github.com/spf13/pflag/string_to_int.go | 149 + .../github.com/spf13/pflag/string_to_int64.go | 149 + .../spf13/pflag/string_to_string.go | 160 + vendor/github.com/spf13/pflag/uint.go | 88 + vendor/github.com/spf13/pflag/uint16.go | 88 + vendor/github.com/spf13/pflag/uint32.go | 88 + vendor/github.com/spf13/pflag/uint64.go | 88 + vendor/github.com/spf13/pflag/uint8.go | 88 + vendor/github.com/spf13/pflag/uint_slice.go | 168 + .../theupdateframework/notary/.gitignore | 17 + .../theupdateframework/notary/CHANGELOG.md | 156 + .../notary/CODE_OF_CONDUCT.md | 43 + .../theupdateframework/notary/CONTRIBUTING.md | 95 + .../theupdateframework/notary/CONTRIBUTORS | 4 + .../theupdateframework/notary/Dockerfile | 27 + .../theupdateframework/notary/Jenkinsfile | 7 + .../theupdateframework/notary/LICENSE | 201 + .../theupdateframework/notary/MAINTAINERS | 70 + .../notary/MAINTAINERS.ALUMNI | 22 + .../notary/MAINTAINERS_RULES.md | 39 + .../theupdateframework/notary/Makefile | 205 + .../theupdateframework/notary/NOTARY_VERSION | 1 + .../theupdateframework/notary/README.md | 135 + .../notary/client/changelist/change.go | 100 + .../notary/client/changelist/changelist.go | 82 + .../client/changelist/file_changelist.go | 208 + .../notary/client/changelist/interface.go | 78 + .../notary/client/client.go | 998 ++ .../notary/client/delegations.go | 226 + .../notary/client/errors.go | 48 + .../notary/client/helpers.go | 306 + .../notary/client/interface.go | 150 + .../notary/client/reader.go | 257 + .../theupdateframework/notary/client/repo.go | 18 + .../notary/client/repo_pkcs11.go | 25 + .../notary/client/tufclient.go | 463 + .../notary/client/witness.go | 62 + .../theupdateframework/notary/codecov.yml | 25 + .../theupdateframework/notary/const.go | 95 + .../notary/const_nowindows.go | 16 + .../notary/const_windows.go | 8 + .../notary/cross.Dockerfile | 29 + .../notary/cryptoservice/certificate.go | 41 + .../notary/cryptoservice/crypto_service.go | 162 + .../notary/development.mysql.yml | 60 + .../notary/development.postgresql.yml | 63 + .../notary/development.rethink.yml | 110 + .../notary/docker-compose.postgresql.yml | 54 + .../notary/docker-compose.rethink.yml | 96 + .../notary/docker-compose.yml | 49 + .../notary/escrow.Dockerfile | 17 + .../theupdateframework/notary/fips.go | 14 + .../theupdateframework/notary/notary.go | 12 + .../notary/passphrase/passphrase.go | 210 + .../notary/server.Dockerfile | 30 + .../notary/server.minimal.Dockerfile | 42 + .../notary/signer.Dockerfile | 31 + .../notary/signer.minimal.Dockerfile | 44 + .../notary/storage/errors.go | 22 + .../notary/storage/filestore.go | 278 + .../notary/storage/httpstore.go | 379 + .../notary/storage/interfaces.go | 39 + .../notary/storage/memorystore.go | 137 + .../notary/storage/offlinestore.go | 58 + .../notary/trustmanager/errors.go | 31 + .../notary/trustmanager/importLogic.md | 8 + .../notary/trustmanager/interfaces.go | 54 + .../notary/trustmanager/keys.go | 246 + .../notary/trustmanager/keystore.go | 262 + .../notary/trustmanager/yubikey/import.go | 59 + .../notary/trustmanager/yubikey/non_pkcs11.go | 9 + .../trustmanager/yubikey/pkcs11_darwin.go | 9 + .../trustmanager/yubikey/pkcs11_interface.go | 40 + .../trustmanager/yubikey/pkcs11_linux.go | 12 + .../trustmanager/yubikey/yubikeystore.go | 924 ++ .../notary/trustpinning/ca.crt | 37 + .../notary/trustpinning/certs.go | 304 + .../notary/trustpinning/test.crt | 31 + .../notary/trustpinning/trustpin.go | 163 + .../theupdateframework/notary/tuf/LICENSE | 30 + .../theupdateframework/notary/tuf/README.md | 6 + .../theupdateframework/notary/tuf/builder.go | 732 + .../notary/tuf/data/errors.go | 53 + .../notary/tuf/data/keys.go | 529 + .../notary/tuf/data/roles.go | 339 + .../notary/tuf/data/root.go | 171 + .../notary/tuf/data/serializer.go | 36 + .../notary/tuf/data/snapshot.go | 169 + .../notary/tuf/data/targets.go | 201 + .../notary/tuf/data/timestamp.go | 136 + .../notary/tuf/data/types.go | 390 + .../notary/tuf/signed/ed25519.go | 111 + .../notary/tuf/signed/errors.go | 98 + .../notary/tuf/signed/interface.go | 47 + .../notary/tuf/signed/sign.go | 114 + .../notary/tuf/signed/verifiers.go | 264 + .../notary/tuf/signed/verify.go | 123 + .../theupdateframework/notary/tuf/tuf.go | 1072 ++ .../notary/tuf/utils/pkcs8.go | 341 + .../notary/tuf/utils/role_sort.go | 31 + .../notary/tuf/utils/stack.go | 85 + .../notary/tuf/utils/utils.go | 119 + .../notary/tuf/utils/x509.go | 564 + .../notary/tuf/validation/errors.go | 126 + vendor/golang.org/x/crypto/LICENSE | 27 + vendor/golang.org/x/crypto/PATENTS | 22 + vendor/golang.org/x/crypto/ed25519/ed25519.go | 71 + vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go | 77 + vendor/golang.org/x/net/LICENSE | 27 + vendor/golang.org/x/net/PATENTS | 22 + .../golang.org/x/net/internal/socks/client.go | 168 + .../golang.org/x/net/internal/socks/socks.go | 317 + vendor/golang.org/x/net/proxy/dial.go | 54 + vendor/golang.org/x/net/proxy/direct.go | 31 + vendor/golang.org/x/net/proxy/per_host.go | 155 + vendor/golang.org/x/net/proxy/proxy.go | 149 + vendor/golang.org/x/net/proxy/socks5.go | 42 + vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + vendor/golang.org/x/sys/execabs/execabs.go | 102 + .../golang.org/x/sys/execabs/execabs_go118.go | 17 + .../golang.org/x/sys/execabs/execabs_go119.go | 20 + vendor/golang.org/x/sys/plan9/asm.s | 8 + vendor/golang.org/x/sys/plan9/asm_plan9_386.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 + vendor/golang.org/x/sys/plan9/asm_plan9_arm.s | 25 + vendor/golang.org/x/sys/plan9/const_plan9.go | 70 + vendor/golang.org/x/sys/plan9/dir_plan9.go | 212 + vendor/golang.org/x/sys/plan9/env_plan9.go | 31 + vendor/golang.org/x/sys/plan9/errors_plan9.go | 50 + vendor/golang.org/x/sys/plan9/mkall.sh | 150 + vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 + .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 + vendor/golang.org/x/sys/plan9/pwd_plan9.go | 23 + vendor/golang.org/x/sys/plan9/race.go | 30 + vendor/golang.org/x/sys/plan9/race0.go | 25 + vendor/golang.org/x/sys/plan9/str.go | 22 + vendor/golang.org/x/sys/plan9/syscall.go | 109 + .../golang.org/x/sys/plan9/syscall_plan9.go | 361 + .../x/sys/plan9/zsyscall_plan9_386.go | 284 + .../x/sys/plan9/zsyscall_plan9_amd64.go | 284 + .../x/sys/plan9/zsyscall_plan9_arm.go | 284 + .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + vendor/golang.org/x/sys/unix/.gitignore | 2 + vendor/golang.org/x/sys/unix/README.md | 184 + .../golang.org/x/sys/unix/affinity_linux.go | 86 + vendor/golang.org/x/sys/unix/aliases.go | 13 + vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 17 + vendor/golang.org/x/sys/unix/asm_bsd_386.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 29 + .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 27 + vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 + vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 50 + .../golang.org/x/sys/unix/asm_linux_loong64.s | 51 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 54 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 52 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 42 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 47 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 54 + .../x/sys/unix/asm_openbsd_mips64.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 + vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 382 + .../golang.org/x/sys/unix/bluetooth_linux.go | 36 + vendor/golang.org/x/sys/unix/bpxsvc_zos.go | 657 + vendor/golang.org/x/sys/unix/bpxsvc_zos.s | 192 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 + vendor/golang.org/x/sys/unix/constants.go | 13 + vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 26 + vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 28 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_zos.go | 28 + vendor/golang.org/x/sys/unix/dirent.go | 102 + vendor/golang.org/x/sys/unix/endian_big.go | 9 + vendor/golang.org/x/sys/unix/endian_little.go | 9 + vendor/golang.org/x/sys/unix/env_unix.go | 31 + vendor/golang.org/x/sys/unix/fcntl.go | 36 + vendor/golang.org/x/sys/unix/fcntl_darwin.go | 24 + .../x/sys/unix/fcntl_linux_32bit.go | 13 + vendor/golang.org/x/sys/unix/fdset.go | 29 + vendor/golang.org/x/sys/unix/gccgo.go | 59 + vendor/golang.org/x/sys/unix/gccgo_c.c | 44 + .../x/sys/unix/gccgo_linux_amd64.go | 20 + vendor/golang.org/x/sys/unix/ifreq_linux.go | 141 + vendor/golang.org/x/sys/unix/ioctl_linux.go | 238 + vendor/golang.org/x/sys/unix/ioctl_signed.go | 69 + .../golang.org/x/sys/unix/ioctl_unsigned.go | 69 + vendor/golang.org/x/sys/unix/ioctl_zos.go | 71 + vendor/golang.org/x/sys/unix/mkall.sh | 249 + vendor/golang.org/x/sys/unix/mkerrors.sh | 791 + vendor/golang.org/x/sys/unix/mmap_nomremap.go | 13 + vendor/golang.org/x/sys/unix/mremap.go | 52 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 + .../golang.org/x/sys/unix/pledge_openbsd.go | 111 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 11 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 11 + vendor/golang.org/x/sys/unix/race.go | 30 + vendor/golang.org/x/sys/unix/race0.go | 25 + .../x/sys/unix/readdirent_getdents.go | 12 + .../x/sys/unix/readdirent_getdirentries.go | 19 + .../x/sys/unix/sockcmsg_dragonfly.go | 16 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 85 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 106 + .../x/sys/unix/sockcmsg_unix_other.go | 46 + vendor/golang.org/x/sys/unix/sockcmsg_zos.go | 58 + .../golang.org/x/sys/unix/symaddr_zos_s390x.s | 75 + vendor/golang.org/x/sys/unix/syscall.go | 86 + vendor/golang.org/x/sys/unix/syscall_aix.go | 582 + .../golang.org/x/sys/unix/syscall_aix_ppc.go | 52 + .../x/sys/unix/syscall_aix_ppc64.go | 83 + vendor/golang.org/x/sys/unix/syscall_bsd.go | 609 + .../golang.org/x/sys/unix/syscall_darwin.go | 646 + .../x/sys/unix/syscall_darwin_amd64.go | 50 + .../x/sys/unix/syscall_darwin_arm64.go | 50 + .../x/sys/unix/syscall_darwin_libSystem.go | 26 + .../x/sys/unix/syscall_dragonfly.go | 347 + .../x/sys/unix/syscall_dragonfly_amd64.go | 56 + .../golang.org/x/sys/unix/syscall_freebsd.go | 455 + .../x/sys/unix/syscall_freebsd_386.go | 64 + .../x/sys/unix/syscall_freebsd_amd64.go | 64 + .../x/sys/unix/syscall_freebsd_arm.go | 60 + .../x/sys/unix/syscall_freebsd_arm64.go | 60 + .../x/sys/unix/syscall_freebsd_riscv64.go | 60 + vendor/golang.org/x/sys/unix/syscall_hurd.go | 29 + .../golang.org/x/sys/unix/syscall_hurd_386.go | 28 + .../golang.org/x/sys/unix/syscall_illumos.go | 78 + vendor/golang.org/x/sys/unix/syscall_linux.go | 2594 ++++ .../x/sys/unix/syscall_linux_386.go | 314 + .../x/sys/unix/syscall_linux_alarm.go | 12 + .../x/sys/unix/syscall_linux_amd64.go | 145 + .../x/sys/unix/syscall_linux_amd64_gc.go | 12 + .../x/sys/unix/syscall_linux_arm.go | 216 + .../x/sys/unix/syscall_linux_arm64.go | 184 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 + .../x/sys/unix/syscall_linux_gc_386.go | 16 + .../x/sys/unix/syscall_linux_gc_arm.go | 13 + .../x/sys/unix/syscall_linux_gccgo_386.go | 30 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 + .../x/sys/unix/syscall_linux_loong64.go | 216 + .../x/sys/unix/syscall_linux_mips64x.go | 188 + .../x/sys/unix/syscall_linux_mipsx.go | 174 + .../x/sys/unix/syscall_linux_ppc.go | 204 + .../x/sys/unix/syscall_linux_ppc64x.go | 115 + .../x/sys/unix/syscall_linux_riscv64.go | 189 + .../x/sys/unix/syscall_linux_s390x.go | 296 + .../x/sys/unix/syscall_linux_sparc64.go | 112 + .../golang.org/x/sys/unix/syscall_netbsd.go | 371 + .../x/sys/unix/syscall_netbsd_386.go | 37 + .../x/sys/unix/syscall_netbsd_amd64.go | 37 + .../x/sys/unix/syscall_netbsd_arm.go | 37 + .../x/sys/unix/syscall_netbsd_arm64.go | 37 + .../golang.org/x/sys/unix/syscall_openbsd.go | 341 + .../x/sys/unix/syscall_openbsd_386.go | 41 + .../x/sys/unix/syscall_openbsd_amd64.go | 41 + .../x/sys/unix/syscall_openbsd_arm.go | 41 + .../x/sys/unix/syscall_openbsd_arm64.go | 41 + .../x/sys/unix/syscall_openbsd_libc.go | 26 + .../x/sys/unix/syscall_openbsd_mips64.go | 39 + .../x/sys/unix/syscall_openbsd_ppc64.go | 41 + .../x/sys/unix/syscall_openbsd_riscv64.go | 41 + .../golang.org/x/sys/unix/syscall_solaris.go | 1104 ++ .../x/sys/unix/syscall_solaris_amd64.go | 27 + vendor/golang.org/x/sys/unix/syscall_unix.go | 606 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 14 + .../x/sys/unix/syscall_unix_gc_ppc64x.go | 22 + .../x/sys/unix/syscall_zos_s390x.go | 3117 ++++ vendor/golang.org/x/sys/unix/sysvshm_linux.go | 20 + vendor/golang.org/x/sys/unix/sysvshm_unix.go | 51 + .../x/sys/unix/sysvshm_unix_other.go | 13 + vendor/golang.org/x/sys/unix/timestruct.go | 76 + .../golang.org/x/sys/unix/unveil_openbsd.go | 51 + vendor/golang.org/x/sys/unix/xattr_bsd.go | 280 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1384 ++ .../x/sys/unix/zerrors_aix_ppc64.go | 1385 ++ .../x/sys/unix/zerrors_darwin_amd64.go | 1910 +++ .../x/sys/unix/zerrors_darwin_arm64.go | 1910 +++ .../x/sys/unix/zerrors_dragonfly_amd64.go | 1737 +++ .../x/sys/unix/zerrors_freebsd_386.go | 2042 +++ .../x/sys/unix/zerrors_freebsd_amd64.go | 2039 +++ .../x/sys/unix/zerrors_freebsd_arm.go | 2033 +++ .../x/sys/unix/zerrors_freebsd_arm64.go | 2033 +++ .../x/sys/unix/zerrors_freebsd_riscv64.go | 2147 +++ vendor/golang.org/x/sys/unix/zerrors_linux.go | 3662 +++++ .../x/sys/unix/zerrors_linux_386.go | 843 ++ .../x/sys/unix/zerrors_linux_amd64.go | 843 ++ .../x/sys/unix/zerrors_linux_arm.go | 848 ++ .../x/sys/unix/zerrors_linux_arm64.go | 843 ++ .../x/sys/unix/zerrors_linux_loong64.go | 835 ++ .../x/sys/unix/zerrors_linux_mips.go | 849 ++ .../x/sys/unix/zerrors_linux_mips64.go | 849 ++ .../x/sys/unix/zerrors_linux_mips64le.go | 849 ++ .../x/sys/unix/zerrors_linux_mipsle.go | 849 ++ .../x/sys/unix/zerrors_linux_ppc.go | 901 ++ .../x/sys/unix/zerrors_linux_ppc64.go | 905 ++ .../x/sys/unix/zerrors_linux_ppc64le.go | 905 ++ .../x/sys/unix/zerrors_linux_riscv64.go | 832 ++ .../x/sys/unix/zerrors_linux_s390x.go | 904 ++ .../x/sys/unix/zerrors_linux_sparc64.go | 947 ++ .../x/sys/unix/zerrors_netbsd_386.go | 1779 +++ .../x/sys/unix/zerrors_netbsd_amd64.go | 1769 +++ .../x/sys/unix/zerrors_netbsd_arm.go | 1758 +++ .../x/sys/unix/zerrors_netbsd_arm64.go | 1769 +++ .../x/sys/unix/zerrors_openbsd_386.go | 1905 +++ .../x/sys/unix/zerrors_openbsd_amd64.go | 1905 +++ .../x/sys/unix/zerrors_openbsd_arm.go | 1905 +++ .../x/sys/unix/zerrors_openbsd_arm64.go | 1905 +++ .../x/sys/unix/zerrors_openbsd_mips64.go | 1905 +++ .../x/sys/unix/zerrors_openbsd_ppc64.go | 1904 +++ .../x/sys/unix/zerrors_openbsd_riscv64.go | 1903 +++ .../x/sys/unix/zerrors_solaris_amd64.go | 1556 ++ .../x/sys/unix/zerrors_zos_s390x.go | 988 ++ .../x/sys/unix/zptrace_armnn_linux.go | 40 + .../x/sys/unix/zptrace_linux_arm64.go | 17 + .../x/sys/unix/zptrace_mipsnn_linux.go | 49 + .../x/sys/unix/zptrace_mipsnnle_linux.go | 49 + .../x/sys/unix/zptrace_x86_linux.go | 79 + .../x/sys/unix/zsymaddr_zos_s390x.s | 364 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1461 ++ .../x/sys/unix/zsyscall_aix_ppc64.go | 1420 ++ .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1188 ++ .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1069 ++ .../x/sys/unix/zsyscall_darwin_amd64.go | 2543 ++++ .../x/sys/unix/zsyscall_darwin_amd64.s | 754 + .../x/sys/unix/zsyscall_darwin_arm64.go | 2543 ++++ .../x/sys/unix/zsyscall_darwin_arm64.s | 754 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1666 +++ .../x/sys/unix/zsyscall_freebsd_386.go | 1886 +++ .../x/sys/unix/zsyscall_freebsd_amd64.go | 1886 +++ .../x/sys/unix/zsyscall_freebsd_arm.go | 1886 +++ .../x/sys/unix/zsyscall_freebsd_arm64.go | 1886 +++ .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1886 +++ .../x/sys/unix/zsyscall_illumos_amd64.go | 101 + .../golang.org/x/sys/unix/zsyscall_linux.go | 2231 +++ .../x/sys/unix/zsyscall_linux_386.go | 486 + .../x/sys/unix/zsyscall_linux_amd64.go | 653 + .../x/sys/unix/zsyscall_linux_arm.go | 601 + .../x/sys/unix/zsyscall_linux_arm64.go | 552 + .../x/sys/unix/zsyscall_linux_loong64.go | 486 + .../x/sys/unix/zsyscall_linux_mips.go | 653 + .../x/sys/unix/zsyscall_linux_mips64.go | 647 + .../x/sys/unix/zsyscall_linux_mips64le.go | 636 + .../x/sys/unix/zsyscall_linux_mipsle.go | 653 + .../x/sys/unix/zsyscall_linux_ppc.go | 658 + .../x/sys/unix/zsyscall_linux_ppc64.go | 704 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 704 + .../x/sys/unix/zsyscall_linux_riscv64.go | 548 + .../x/sys/unix/zsyscall_linux_s390x.go | 495 + .../x/sys/unix/zsyscall_linux_sparc64.go | 648 + .../x/sys/unix/zsyscall_netbsd_386.go | 1848 +++ .../x/sys/unix/zsyscall_netbsd_amd64.go | 1848 +++ .../x/sys/unix/zsyscall_netbsd_arm.go | 1848 +++ .../x/sys/unix/zsyscall_netbsd_arm64.go | 1848 +++ .../x/sys/unix/zsyscall_openbsd_386.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_386.s | 694 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_amd64.s | 694 + .../x/sys/unix/zsyscall_openbsd_arm.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_arm.s | 694 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_arm64.s | 694 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_mips64.s | 694 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_ppc64.s | 832 ++ .../x/sys/unix/zsyscall_openbsd_riscv64.go | 2299 +++ .../x/sys/unix/zsyscall_openbsd_riscv64.s | 694 + .../x/sys/unix/zsyscall_solaris_amd64.go | 2103 +++ .../x/sys/unix/zsyscall_zos_s390x.go | 3458 +++++ .../x/sys/unix/zsysctl_openbsd_386.go | 280 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 280 + .../x/sys/unix/zsysctl_openbsd_arm.go | 280 + .../x/sys/unix/zsysctl_openbsd_arm64.go | 280 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 280 + .../x/sys/unix/zsysctl_openbsd_ppc64.go | 280 + .../x/sys/unix/zsysctl_openbsd_riscv64.go | 281 + .../x/sys/unix/zsysnum_darwin_amd64.go | 439 + .../x/sys/unix/zsysnum_darwin_arm64.go | 437 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 316 + .../x/sys/unix/zsysnum_freebsd_386.go | 393 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 393 + .../x/sys/unix/zsysnum_freebsd_arm.go | 393 + .../x/sys/unix/zsysnum_freebsd_arm64.go | 393 + .../x/sys/unix/zsysnum_freebsd_riscv64.go | 393 + .../x/sys/unix/zsysnum_linux_386.go | 460 + .../x/sys/unix/zsysnum_linux_amd64.go | 382 + .../x/sys/unix/zsysnum_linux_arm.go | 424 + .../x/sys/unix/zsysnum_linux_arm64.go | 327 + .../x/sys/unix/zsysnum_linux_loong64.go | 321 + .../x/sys/unix/zsysnum_linux_mips.go | 444 + .../x/sys/unix/zsysnum_linux_mips64.go | 374 + .../x/sys/unix/zsysnum_linux_mips64le.go | 374 + .../x/sys/unix/zsysnum_linux_mipsle.go | 444 + .../x/sys/unix/zsysnum_linux_ppc.go | 451 + .../x/sys/unix/zsysnum_linux_ppc64.go | 423 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 423 + .../x/sys/unix/zsysnum_linux_riscv64.go | 328 + .../x/sys/unix/zsysnum_linux_s390x.go | 389 + .../x/sys/unix/zsysnum_linux_sparc64.go | 402 + .../x/sys/unix/zsysnum_netbsd_386.go | 274 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 + .../x/sys/unix/zsysnum_openbsd_386.go | 219 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 219 + .../x/sys/unix/zsysnum_openbsd_arm.go | 219 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 218 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 221 + .../x/sys/unix/zsysnum_openbsd_ppc64.go | 217 + .../x/sys/unix/zsysnum_openbsd_riscv64.go | 218 + .../x/sys/unix/zsysnum_zos_s390x.go | 2852 ++++ .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 353 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 357 + .../x/sys/unix/ztypes_darwin_amd64.go | 805 + .../x/sys/unix/ztypes_darwin_arm64.go | 805 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 473 + .../x/sys/unix/ztypes_freebsd_386.go | 650 + .../x/sys/unix/ztypes_freebsd_amd64.go | 655 + .../x/sys/unix/ztypes_freebsd_arm.go | 641 + .../x/sys/unix/ztypes_freebsd_arm64.go | 635 + .../x/sys/unix/ztypes_freebsd_riscv64.go | 637 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 6034 ++++++++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 689 + .../x/sys/unix/ztypes_linux_amd64.go | 703 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 683 + .../x/sys/unix/ztypes_linux_arm64.go | 682 + .../x/sys/unix/ztypes_linux_loong64.go | 683 + .../x/sys/unix/ztypes_linux_mips.go | 688 + .../x/sys/unix/ztypes_linux_mips64.go | 685 + .../x/sys/unix/ztypes_linux_mips64le.go | 685 + .../x/sys/unix/ztypes_linux_mipsle.go | 688 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 696 + .../x/sys/unix/ztypes_linux_ppc64.go | 691 + .../x/sys/unix/ztypes_linux_ppc64le.go | 691 + .../x/sys/unix/ztypes_linux_riscv64.go | 737 + .../x/sys/unix/ztypes_linux_s390x.go | 705 + .../x/sys/unix/ztypes_linux_sparc64.go | 686 + .../x/sys/unix/ztypes_netbsd_386.go | 585 + .../x/sys/unix/ztypes_netbsd_amd64.go | 593 + .../x/sys/unix/ztypes_netbsd_arm.go | 590 + .../x/sys/unix/ztypes_netbsd_arm64.go | 593 + .../x/sys/unix/ztypes_openbsd_386.go | 568 + .../x/sys/unix/ztypes_openbsd_amd64.go | 568 + .../x/sys/unix/ztypes_openbsd_arm.go | 575 + .../x/sys/unix/ztypes_openbsd_arm64.go | 568 + .../x/sys/unix/ztypes_openbsd_mips64.go | 568 + .../x/sys/unix/ztypes_openbsd_ppc64.go | 570 + .../x/sys/unix/ztypes_openbsd_riscv64.go | 570 + .../x/sys/unix/ztypes_solaris_amd64.go | 516 + .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 546 + vendor/golang.org/x/sys/windows/aliases.go | 12 + .../golang.org/x/sys/windows/dll_windows.go | 416 + .../golang.org/x/sys/windows/env_windows.go | 57 + vendor/golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 248 + .../x/sys/windows/memory_windows.go | 48 + vendor/golang.org/x/sys/windows/mkerrors.bash | 70 + .../x/sys/windows/mkknownfolderids.bash | 27 + vendor/golang.org/x/sys/windows/mksyscall.go | 9 + vendor/golang.org/x/sys/windows/race.go | 30 + vendor/golang.org/x/sys/windows/race0.go | 25 + .../x/sys/windows/security_windows.go | 1436 ++ vendor/golang.org/x/sys/windows/service.go | 257 + .../x/sys/windows/setupapi_windows.go | 1425 ++ vendor/golang.org/x/sys/windows/str.go | 22 + vendor/golang.org/x/sys/windows/syscall.go | 104 + .../x/sys/windows/syscall_windows.go | 1918 +++ .../golang.org/x/sys/windows/types_windows.go | 3406 +++++ .../x/sys/windows/types_windows_386.go | 35 + .../x/sys/windows/types_windows_amd64.go | 34 + .../x/sys/windows/types_windows_arm.go | 35 + .../x/sys/windows/types_windows_arm64.go | 34 + .../x/sys/windows/zerrors_windows.go | 9468 ++++++++++++ .../x/sys/windows/zknownfolderids_windows.go | 149 + .../x/sys/windows/zsyscall_windows.go | 4535 ++++++ vendor/golang.org/x/term/CONTRIBUTING.md | 26 + vendor/golang.org/x/term/LICENSE | 27 + vendor/golang.org/x/term/PATENTS | 22 + vendor/golang.org/x/term/README.md | 19 + vendor/golang.org/x/term/codereview.cfg | 1 + vendor/golang.org/x/term/term.go | 60 + vendor/golang.org/x/term/term_plan9.go | 42 + vendor/golang.org/x/term/term_unix.go | 91 + vendor/golang.org/x/term/term_unix_bsd.go | 12 + vendor/golang.org/x/term/term_unix_other.go | 12 + vendor/golang.org/x/term/term_unsupported.go | 38 + vendor/golang.org/x/term/term_windows.go | 79 + vendor/golang.org/x/term/terminal.go | 986 ++ vendor/google.golang.org/protobuf/LICENSE | 27 + vendor/google.golang.org/protobuf/PATENTS | 22 + .../protobuf/encoding/prototext/decode.go | 772 + .../protobuf/encoding/prototext/doc.go | 7 + .../protobuf/encoding/prototext/encode.go | 376 + .../protobuf/encoding/protowire/wire.go | 547 + .../protobuf/internal/descfmt/stringer.go | 413 + .../protobuf/internal/descopts/options.go | 29 + .../protobuf/internal/detrand/rand.go | 69 + .../internal/editiondefaults/defaults.go | 12 + .../editiondefaults/editions_defaults.binpb | 4 + .../internal/encoding/defval/default.go | 213 + .../encoding/messageset/messageset.go | 242 + .../protobuf/internal/encoding/tag/tag.go | 207 + .../protobuf/internal/encoding/text/decode.go | 686 + .../internal/encoding/text/decode_number.go | 211 + .../internal/encoding/text/decode_string.go | 161 + .../internal/encoding/text/decode_token.go | 373 + .../protobuf/internal/encoding/text/doc.go | 29 + .../protobuf/internal/encoding/text/encode.go | 272 + .../protobuf/internal/errors/errors.go | 89 + .../protobuf/internal/errors/is_go112.go | 40 + .../protobuf/internal/errors/is_go113.go | 13 + .../protobuf/internal/filedesc/build.go | 157 + .../protobuf/internal/filedesc/desc.go | 703 + .../protobuf/internal/filedesc/desc_init.go | 523 + .../protobuf/internal/filedesc/desc_lazy.go | 732 + .../protobuf/internal/filedesc/desc_list.go | 457 + .../internal/filedesc/desc_list_gen.go | 356 + .../protobuf/internal/filedesc/editions.go | 142 + .../protobuf/internal/filedesc/placeholder.go | 109 + .../protobuf/internal/filetype/build.go | 296 + .../protobuf/internal/flags/flags.go | 24 + .../internal/flags/proto_legacy_disable.go | 10 + .../internal/flags/proto_legacy_enable.go | 10 + .../protobuf/internal/genid/any_gen.go | 34 + .../protobuf/internal/genid/api_gen.go | 106 + .../protobuf/internal/genid/descriptor_gen.go | 1233 ++ .../protobuf/internal/genid/doc.go | 11 + .../protobuf/internal/genid/duration_gen.go | 34 + .../protobuf/internal/genid/empty_gen.go | 19 + .../protobuf/internal/genid/field_mask_gen.go | 31 + .../internal/genid/go_features_gen.go | 31 + .../protobuf/internal/genid/goname.go | 25 + .../protobuf/internal/genid/map_entry.go | 16 + .../internal/genid/source_context_gen.go | 31 + .../protobuf/internal/genid/struct_gen.go | 121 + .../protobuf/internal/genid/timestamp_gen.go | 34 + .../protobuf/internal/genid/type_gen.go | 228 + .../protobuf/internal/genid/wrappers.go | 13 + .../protobuf/internal/genid/wrappers_gen.go | 175 + .../protobuf/internal/impl/api_export.go | 177 + .../protobuf/internal/impl/checkinit.go | 141 + .../protobuf/internal/impl/codec_extension.go | 215 + .../protobuf/internal/impl/codec_field.go | 830 ++ .../protobuf/internal/impl/codec_gen.go | 5724 ++++++++ .../protobuf/internal/impl/codec_map.go | 388 + .../protobuf/internal/impl/codec_map_go111.go | 38 + .../protobuf/internal/impl/codec_map_go112.go | 12 + .../protobuf/internal/impl/codec_message.go | 217 + .../internal/impl/codec_messageset.go | 123 + .../protobuf/internal/impl/codec_reflect.go | 210 + .../protobuf/internal/impl/codec_tables.go | 557 + .../protobuf/internal/impl/codec_unsafe.go | 18 + .../protobuf/internal/impl/convert.go | 495 + .../protobuf/internal/impl/convert_list.go | 141 + .../protobuf/internal/impl/convert_map.go | 121 + .../protobuf/internal/impl/decode.go | 285 + .../protobuf/internal/impl/encode.go | 201 + .../protobuf/internal/impl/enum.go | 21 + .../protobuf/internal/impl/extension.go | 156 + .../protobuf/internal/impl/legacy_enum.go | 218 + .../protobuf/internal/impl/legacy_export.go | 92 + .../internal/impl/legacy_extension.go | 176 + .../protobuf/internal/impl/legacy_file.go | 81 + .../protobuf/internal/impl/legacy_message.go | 568 + .../protobuf/internal/impl/merge.go | 176 + .../protobuf/internal/impl/merge_gen.go | 209 + .../protobuf/internal/impl/message.go | 284 + .../protobuf/internal/impl/message_reflect.go | 463 + .../internal/impl/message_reflect_field.go | 543 + .../internal/impl/message_reflect_gen.go | 249 + .../protobuf/internal/impl/pointer_reflect.go | 215 + .../protobuf/internal/impl/pointer_unsafe.go | 215 + .../protobuf/internal/impl/validate.go | 576 + .../protobuf/internal/impl/weak.go | 74 + .../protobuf/internal/order/order.go | 89 + .../protobuf/internal/order/range.go | 115 + .../protobuf/internal/pragma/pragma.go | 29 + .../protobuf/internal/set/ints.go | 58 + .../protobuf/internal/strs/strings.go | 196 + .../protobuf/internal/strs/strings_pure.go | 28 + .../internal/strs/strings_unsafe_go120.go | 95 + .../internal/strs/strings_unsafe_go121.go | 74 + .../protobuf/internal/version/version.go | 79 + .../protobuf/proto/checkinit.go | 71 + .../protobuf/proto/decode.go | 294 + .../protobuf/proto/decode_gen.go | 603 + .../google.golang.org/protobuf/proto/doc.go | 86 + .../protobuf/proto/encode.go | 322 + .../protobuf/proto/encode_gen.go | 97 + .../google.golang.org/protobuf/proto/equal.go | 57 + .../protobuf/proto/extension.go | 92 + .../google.golang.org/protobuf/proto/merge.go | 139 + .../protobuf/proto/messageset.go | 93 + .../google.golang.org/protobuf/proto/proto.go | 45 + .../protobuf/proto/proto_methods.go | 20 + .../protobuf/proto/proto_reflect.go | 20 + .../google.golang.org/protobuf/proto/reset.go | 43 + .../google.golang.org/protobuf/proto/size.go | 101 + .../protobuf/proto/size_gen.go | 55 + .../protobuf/proto/wrappers.go | 29 + .../protobuf/reflect/protodesc/desc.go | 285 + .../protobuf/reflect/protodesc/desc_init.go | 304 + .../reflect/protodesc/desc_resolve.go | 286 + .../reflect/protodesc/desc_validate.go | 374 + .../protobuf/reflect/protodesc/editions.go | 148 + .../protobuf/reflect/protodesc/proto.go | 252 + .../protobuf/reflect/protoreflect/methods.go | 78 + .../protobuf/reflect/protoreflect/proto.go | 513 + .../protobuf/reflect/protoreflect/source.go | 129 + .../reflect/protoreflect/source_gen.go | 552 + .../protobuf/reflect/protoreflect/type.go | 666 + .../protobuf/reflect/protoreflect/value.go | 285 + .../reflect/protoreflect/value_equal.go | 168 + .../reflect/protoreflect/value_pure.go | 60 + .../reflect/protoreflect/value_union.go | 438 + .../protoreflect/value_unsafe_go120.go | 99 + .../protoreflect/value_unsafe_go121.go | 87 + .../reflect/protoregistry/registry.go | 882 ++ .../protobuf/runtime/protoiface/legacy.go | 15 + .../protobuf/runtime/protoiface/methods.go | 168 + .../protobuf/runtime/protoimpl/impl.go | 44 + .../protobuf/runtime/protoimpl/version.go | 60 + .../types/descriptorpb/descriptor.pb.go | 5648 +++++++ .../types/gofeaturespb/go_features.pb.go | 177 + .../types/gofeaturespb/go_features.proto | 28 + .../protobuf/types/known/anypb/any.pb.go | 496 + .../types/known/durationpb/duration.pb.go | 374 + .../types/known/timestamppb/timestamp.pb.go | 383 + vendor/modules.txt | 274 + 1602 files changed, 444378 insertions(+), 18 deletions(-) create mode 100644 Makefile create mode 100644 vendor/github.com/Azure/go-ansiterm/LICENSE create mode 100644 vendor/github.com/Azure/go-ansiterm/README.md create mode 100644 vendor/github.com/Azure/go-ansiterm/constants.go create mode 100644 vendor/github.com/Azure/go-ansiterm/context.go create mode 100644 vendor/github.com/Azure/go-ansiterm/csi_entry_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/csi_param_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/escape_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/event_handler.go create mode 100644 vendor/github.com/Azure/go-ansiterm/ground_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/osc_string_state.go create mode 100644 vendor/github.com/Azure/go-ansiterm/parser.go create mode 100644 vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go create mode 100644 vendor/github.com/Azure/go-ansiterm/parser_actions.go create mode 100644 vendor/github.com/Azure/go-ansiterm/states.go create mode 100644 vendor/github.com/Azure/go-ansiterm/utilities.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/ansi.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/api.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/utilities.go create mode 100644 vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go create mode 100644 vendor/github.com/Microsoft/go-winio/.gitignore create mode 100644 vendor/github.com/Microsoft/go-winio/CODEOWNERS create mode 100644 vendor/github.com/Microsoft/go-winio/LICENSE create mode 100644 vendor/github.com/Microsoft/go-winio/README.md create mode 100644 vendor/github.com/Microsoft/go-winio/backup.go create mode 100644 vendor/github.com/Microsoft/go-winio/ea.go create mode 100644 vendor/github.com/Microsoft/go-winio/file.go create mode 100644 vendor/github.com/Microsoft/go-winio/fileinfo.go create mode 100644 vendor/github.com/Microsoft/go-winio/hvsock.go create mode 100644 vendor/github.com/Microsoft/go-winio/pipe.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go create mode 100644 vendor/github.com/Microsoft/go-winio/privilege.go create mode 100644 vendor/github.com/Microsoft/go-winio/reparse.go create mode 100644 vendor/github.com/Microsoft/go-winio/sd.go create mode 100644 vendor/github.com/Microsoft/go-winio/syscall.go create mode 100644 vendor/github.com/Microsoft/go-winio/zsyscall_windows.go create mode 100644 vendor/github.com/alecthomas/kong/.gitignore create mode 100644 vendor/github.com/alecthomas/kong/.golangci.yml create mode 100644 vendor/github.com/alecthomas/kong/COPYING create mode 100644 vendor/github.com/alecthomas/kong/README.md create mode 100644 vendor/github.com/alecthomas/kong/build.go create mode 100644 vendor/github.com/alecthomas/kong/callbacks.go create mode 100644 vendor/github.com/alecthomas/kong/camelcase.go create mode 100644 vendor/github.com/alecthomas/kong/context.go create mode 100644 vendor/github.com/alecthomas/kong/defaults.go create mode 100644 vendor/github.com/alecthomas/kong/doc.go create mode 100644 vendor/github.com/alecthomas/kong/error.go create mode 100644 vendor/github.com/alecthomas/kong/global.go create mode 100644 vendor/github.com/alecthomas/kong/guesswidth.go create mode 100644 vendor/github.com/alecthomas/kong/guesswidth_unix.go create mode 100644 vendor/github.com/alecthomas/kong/help.go create mode 100644 vendor/github.com/alecthomas/kong/hooks.go create mode 100644 vendor/github.com/alecthomas/kong/interpolate.go create mode 100644 vendor/github.com/alecthomas/kong/kong.go create mode 100644 vendor/github.com/alecthomas/kong/kong.png create mode 100644 vendor/github.com/alecthomas/kong/kong.sketch create mode 100644 vendor/github.com/alecthomas/kong/levenshtein.go create mode 100644 vendor/github.com/alecthomas/kong/mapper.go create mode 100644 vendor/github.com/alecthomas/kong/model.go create mode 100644 vendor/github.com/alecthomas/kong/options.go create mode 100644 vendor/github.com/alecthomas/kong/renovate.json5 create mode 100644 vendor/github.com/alecthomas/kong/resolver.go create mode 100644 vendor/github.com/alecthomas/kong/scanner.go create mode 100644 vendor/github.com/alecthomas/kong/tag.go create mode 100644 vendor/github.com/alecthomas/kong/util.go create mode 100644 vendor/github.com/alecthomas/kong/visit.go create mode 100644 vendor/github.com/beorn7/perks/LICENSE create mode 100644 vendor/github.com/beorn7/perks/quantile/exampledata.txt create mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 vendor/github.com/cespare/xxhash/v2/.travis.yml create mode 100644 vendor/github.com/cespare/xxhash/v2/LICENSE.txt create mode 100644 vendor/github.com/cespare/xxhash/v2/README.md create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_other.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_safe.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go create mode 100644 vendor/github.com/distribution/distribution/LICENSE create mode 100644 vendor/github.com/distribution/distribution/reference/helpers_deprecated.go create mode 100644 vendor/github.com/distribution/distribution/reference/normalize_deprecated.go create mode 100644 vendor/github.com/distribution/distribution/reference/reference_deprecated.go create mode 100644 vendor/github.com/distribution/distribution/reference/regexp_deprecated.go create mode 100644 vendor/github.com/distribution/distribution/reference/sort_deprecated.go create mode 100644 vendor/github.com/distribution/reference/.gitattributes create mode 100644 vendor/github.com/distribution/reference/.gitignore create mode 100644 vendor/github.com/distribution/reference/.golangci.yml create mode 100644 vendor/github.com/distribution/reference/CODE-OF-CONDUCT.md create mode 100644 vendor/github.com/distribution/reference/CONTRIBUTING.md create mode 100644 vendor/github.com/distribution/reference/GOVERNANCE.md create mode 100644 vendor/github.com/distribution/reference/LICENSE create mode 100644 vendor/github.com/distribution/reference/MAINTAINERS create mode 100644 vendor/github.com/distribution/reference/Makefile create mode 100644 vendor/github.com/distribution/reference/README.md create mode 100644 vendor/github.com/distribution/reference/SECURITY.md create mode 100644 vendor/github.com/distribution/reference/distribution-logo.svg create mode 100644 vendor/github.com/distribution/reference/helpers.go create mode 100644 vendor/github.com/distribution/reference/normalize.go create mode 100644 vendor/github.com/distribution/reference/reference.go create mode 100644 vendor/github.com/distribution/reference/regexp.go create mode 100644 vendor/github.com/distribution/reference/sort.go create mode 100644 vendor/github.com/docker/cli/AUTHORS create mode 100644 vendor/github.com/docker/cli/LICENSE create mode 100644 vendor/github.com/docker/cli/NOTICE create mode 100644 vendor/github.com/docker/cli/cli/command/cli.go create mode 100644 vendor/github.com/docker/cli/cli/command/cli_options.go create mode 100644 vendor/github.com/docker/cli/cli/command/context.go create mode 100644 vendor/github.com/docker/cli/cli/command/defaultcontextstore.go create mode 100644 vendor/github.com/docker/cli/cli/command/events_utils.go create mode 100644 vendor/github.com/docker/cli/cli/command/registry.go create mode 100644 vendor/github.com/docker/cli/cli/command/trust.go create mode 100644 vendor/github.com/docker/cli/cli/command/utils.go create mode 100644 vendor/github.com/docker/cli/cli/config/config.go create mode 100644 vendor/github.com/docker/cli/cli/config/configfile/file.go create mode 100644 vendor/github.com/docker/cli/cli/config/configfile/file_unix.go create mode 100644 vendor/github.com/docker/cli/cli/config/configfile/file_windows.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/credentials.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/default_store.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/default_store_darwin.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/default_store_linux.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/default_store_windows.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/file_store.go create mode 100644 vendor/github.com/docker/cli/cli/config/credentials/native_store.go create mode 100644 vendor/github.com/docker/cli/cli/config/types/authconfig.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/commandconn/commandconn.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/commandconn/pdeathsig_linux.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/commandconn/pdeathsig_nolinux.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/commandconn/session_unix.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/commandconn/session_windows.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/connhelper.go create mode 100644 vendor/github.com/docker/cli/cli/connhelper/ssh/ssh.go create mode 100644 vendor/github.com/docker/cli/cli/context/docker/constants.go create mode 100644 vendor/github.com/docker/cli/cli/context/docker/load.go create mode 100644 vendor/github.com/docker/cli/cli/context/endpoint.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/doc.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/io_utils.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/metadatastore.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/store.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/storeconfig.go create mode 100644 vendor/github.com/docker/cli/cli/context/store/tlsstore.go create mode 100644 vendor/github.com/docker/cli/cli/context/tlsdata.go create mode 100644 vendor/github.com/docker/cli/cli/debug/debug.go create mode 100644 vendor/github.com/docker/cli/cli/flags/options.go create mode 100644 vendor/github.com/docker/cli/cli/hints/hints.go create mode 100644 vendor/github.com/docker/cli/cli/manifest/store/store.go create mode 100644 vendor/github.com/docker/cli/cli/manifest/types/types.go create mode 100644 vendor/github.com/docker/cli/cli/registry/client/client.go create mode 100644 vendor/github.com/docker/cli/cli/registry/client/endpoint.go create mode 100644 vendor/github.com/docker/cli/cli/registry/client/fetcher.go create mode 100644 vendor/github.com/docker/cli/cli/streams/in.go create mode 100644 vendor/github.com/docker/cli/cli/streams/out.go create mode 100644 vendor/github.com/docker/cli/cli/streams/stream.go create mode 100644 vendor/github.com/docker/cli/cli/trust/trust.go create mode 100644 vendor/github.com/docker/cli/cli/version/version.go create mode 100644 vendor/github.com/docker/cli/opts/capabilities.go create mode 100644 vendor/github.com/docker/cli/opts/config.go create mode 100644 vendor/github.com/docker/cli/opts/duration.go create mode 100644 vendor/github.com/docker/cli/opts/env.go create mode 100644 vendor/github.com/docker/cli/opts/envfile.go create mode 100644 vendor/github.com/docker/cli/opts/file.go create mode 100644 vendor/github.com/docker/cli/opts/gpus.go create mode 100644 vendor/github.com/docker/cli/opts/hosts.go create mode 100644 vendor/github.com/docker/cli/opts/hosts_unix.go create mode 100644 vendor/github.com/docker/cli/opts/hosts_windows.go create mode 100644 vendor/github.com/docker/cli/opts/ip.go create mode 100644 vendor/github.com/docker/cli/opts/mount.go create mode 100644 vendor/github.com/docker/cli/opts/network.go create mode 100644 vendor/github.com/docker/cli/opts/opts.go create mode 100644 vendor/github.com/docker/cli/opts/parse.go create mode 100644 vendor/github.com/docker/cli/opts/port.go create mode 100644 vendor/github.com/docker/cli/opts/quotedstring.go create mode 100644 vendor/github.com/docker/cli/opts/secret.go create mode 100644 vendor/github.com/docker/cli/opts/throttledevice.go create mode 100644 vendor/github.com/docker/cli/opts/ulimit.go create mode 100644 vendor/github.com/docker/cli/opts/weightdevice.go create mode 100644 vendor/github.com/docker/distribution/.dockerignore create mode 100644 vendor/github.com/docker/distribution/.gitignore create mode 100644 vendor/github.com/docker/distribution/.golangci.yml create mode 100644 vendor/github.com/docker/distribution/.mailmap create mode 100644 vendor/github.com/docker/distribution/BUILDING.md create mode 100644 vendor/github.com/docker/distribution/CONTRIBUTING.md create mode 100644 vendor/github.com/docker/distribution/Dockerfile create mode 100644 vendor/github.com/docker/distribution/LICENSE create mode 100644 vendor/github.com/docker/distribution/MAINTAINERS create mode 100644 vendor/github.com/docker/distribution/Makefile create mode 100644 vendor/github.com/docker/distribution/README.md create mode 100644 vendor/github.com/docker/distribution/ROADMAP.md create mode 100644 vendor/github.com/docker/distribution/blobs.go create mode 100644 vendor/github.com/docker/distribution/digestset/set.go create mode 100644 vendor/github.com/docker/distribution/doc.go create mode 100644 vendor/github.com/docker/distribution/docker-bake.hcl create mode 100644 vendor/github.com/docker/distribution/errors.go create mode 100644 vendor/github.com/docker/distribution/manifest/doc.go create mode 100644 vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go create mode 100644 vendor/github.com/docker/distribution/manifest/ocischema/builder.go create mode 100644 vendor/github.com/docker/distribution/manifest/ocischema/manifest.go create mode 100644 vendor/github.com/docker/distribution/manifest/schema2/builder.go create mode 100644 vendor/github.com/docker/distribution/manifest/schema2/manifest.go create mode 100644 vendor/github.com/docker/distribution/manifest/versioned.go create mode 100644 vendor/github.com/docker/distribution/manifests.go create mode 100644 vendor/github.com/docker/distribution/metrics/prometheus.go create mode 100644 vendor/github.com/docker/distribution/reference/helpers.go create mode 100644 vendor/github.com/docker/distribution/reference/normalize.go create mode 100644 vendor/github.com/docker/distribution/reference/reference.go create mode 100644 vendor/github.com/docker/distribution/reference/regexp.go create mode 100644 vendor/github.com/docker/distribution/registry.go create mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/errors.go create mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/handler.go create mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/register.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/descriptors.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/doc.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/errors.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/headerparser.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/routes.go create mode 100644 vendor/github.com/docker/distribution/registry/api/v2/urls.go create mode 100644 vendor/github.com/docker/distribution/registry/client/auth/api_version.go create mode 100644 vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go create mode 100644 vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go create mode 100644 vendor/github.com/docker/distribution/registry/client/auth/session.go create mode 100644 vendor/github.com/docker/distribution/registry/client/blob_writer.go create mode 100644 vendor/github.com/docker/distribution/registry/client/errors.go create mode 100644 vendor/github.com/docker/distribution/registry/client/repository.go create mode 100644 vendor/github.com/docker/distribution/registry/client/transport/http_reader.go create mode 100644 vendor/github.com/docker/distribution/registry/client/transport/transport.go create mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/cache.go create mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go create mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go create mode 100644 vendor/github.com/docker/distribution/tags.go create mode 100644 vendor/github.com/docker/distribution/uuid/uuid.go create mode 100644 vendor/github.com/docker/distribution/vendor.conf create mode 100644 vendor/github.com/docker/docker-credential-helpers/LICENSE create mode 100644 vendor/github.com/docker/docker-credential-helpers/client/client.go create mode 100644 vendor/github.com/docker/docker-credential-helpers/client/command.go create mode 100644 vendor/github.com/docker/docker-credential-helpers/credentials/credentials.go create mode 100644 vendor/github.com/docker/docker-credential-helpers/credentials/error.go create mode 100644 vendor/github.com/docker/docker-credential-helpers/credentials/helper.go create mode 100644 vendor/github.com/docker/docker-credential-helpers/credentials/version.go create mode 100644 vendor/github.com/docker/docker/AUTHORS create mode 100644 vendor/github.com/docker/docker/LICENSE create mode 100644 vendor/github.com/docker/docker/NOTICE create mode 100644 vendor/github.com/docker/docker/api/README.md create mode 100644 vendor/github.com/docker/docker/api/common.go create mode 100644 vendor/github.com/docker/docker/api/common_unix.go create mode 100644 vendor/github.com/docker/docker/api/common_windows.go create mode 100644 vendor/github.com/docker/docker/api/swagger-gen.yaml create mode 100644 vendor/github.com/docker/docker/api/swagger.yaml create mode 100644 vendor/github.com/docker/docker/api/types/auth.go create mode 100644 vendor/github.com/docker/docker/api/types/blkiodev/blkio.go create mode 100644 vendor/github.com/docker/docker/api/types/client.go create mode 100644 vendor/github.com/docker/docker/api/types/configs.go create mode 100644 vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go create mode 100644 vendor/github.com/docker/docker/api/types/container/change_type.go create mode 100644 vendor/github.com/docker/docker/api/types/container/change_types.go create mode 100644 vendor/github.com/docker/docker/api/types/container/config.go create mode 100644 vendor/github.com/docker/docker/api/types/container/container_top.go create mode 100644 vendor/github.com/docker/docker/api/types/container/container_update.go create mode 100644 vendor/github.com/docker/docker/api/types/container/create_response.go create mode 100644 vendor/github.com/docker/docker/api/types/container/filesystem_change.go create mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig.go create mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go create mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go create mode 100644 vendor/github.com/docker/docker/api/types/container/wait_exit_error.go create mode 100644 vendor/github.com/docker/docker/api/types/container/wait_response.go create mode 100644 vendor/github.com/docker/docker/api/types/container/waitcondition.go create mode 100644 vendor/github.com/docker/docker/api/types/error_response.go create mode 100644 vendor/github.com/docker/docker/api/types/error_response_ext.go create mode 100644 vendor/github.com/docker/docker/api/types/events/events.go create mode 100644 vendor/github.com/docker/docker/api/types/filters/errors.go create mode 100644 vendor/github.com/docker/docker/api/types/filters/parse.go create mode 100644 vendor/github.com/docker/docker/api/types/graph_driver_data.go create mode 100644 vendor/github.com/docker/docker/api/types/id_response.go create mode 100644 vendor/github.com/docker/docker/api/types/image/image_history.go create mode 100644 vendor/github.com/docker/docker/api/types/image/opts.go create mode 100644 vendor/github.com/docker/docker/api/types/image_delete_response_item.go create mode 100644 vendor/github.com/docker/docker/api/types/image_summary.go create mode 100644 vendor/github.com/docker/docker/api/types/mount/mount.go create mode 100644 vendor/github.com/docker/docker/api/types/network/network.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_device.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_env.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_interface_type.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_mount.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_responses.go create mode 100644 vendor/github.com/docker/docker/api/types/port.go create mode 100644 vendor/github.com/docker/docker/api/types/registry/authconfig.go create mode 100644 vendor/github.com/docker/docker/api/types/registry/authenticate.go create mode 100644 vendor/github.com/docker/docker/api/types/registry/registry.go create mode 100644 vendor/github.com/docker/docker/api/types/service_update_response.go create mode 100644 vendor/github.com/docker/docker/api/types/stats.go create mode 100644 vendor/github.com/docker/docker/api/types/strslice/strslice.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/common.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/config.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/container.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/network.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/node.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/runtime.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto create mode 100644 vendor/github.com/docker/docker/api/types/swarm/secret.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/service.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/swarm.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/task.go create mode 100644 vendor/github.com/docker/docker/api/types/time/timestamp.go create mode 100644 vendor/github.com/docker/docker/api/types/types.go create mode 100644 vendor/github.com/docker/docker/api/types/versions/README.md create mode 100644 vendor/github.com/docker/docker/api/types/versions/compare.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/cluster_volume.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/create_options.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/list_response.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/options.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/volume.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/volume_update.go create mode 100644 vendor/github.com/docker/docker/client/README.md create mode 100644 vendor/github.com/docker/docker/client/build_cancel.go create mode 100644 vendor/github.com/docker/docker/client/build_prune.go create mode 100644 vendor/github.com/docker/docker/client/checkpoint_create.go create mode 100644 vendor/github.com/docker/docker/client/checkpoint_delete.go create mode 100644 vendor/github.com/docker/docker/client/checkpoint_list.go create mode 100644 vendor/github.com/docker/docker/client/client.go create mode 100644 vendor/github.com/docker/docker/client/client_deprecated.go create mode 100644 vendor/github.com/docker/docker/client/client_unix.go create mode 100644 vendor/github.com/docker/docker/client/client_windows.go create mode 100644 vendor/github.com/docker/docker/client/config_create.go create mode 100644 vendor/github.com/docker/docker/client/config_inspect.go create mode 100644 vendor/github.com/docker/docker/client/config_list.go create mode 100644 vendor/github.com/docker/docker/client/config_remove.go create mode 100644 vendor/github.com/docker/docker/client/config_update.go create mode 100644 vendor/github.com/docker/docker/client/container_attach.go create mode 100644 vendor/github.com/docker/docker/client/container_commit.go create mode 100644 vendor/github.com/docker/docker/client/container_copy.go create mode 100644 vendor/github.com/docker/docker/client/container_create.go create mode 100644 vendor/github.com/docker/docker/client/container_diff.go create mode 100644 vendor/github.com/docker/docker/client/container_exec.go create mode 100644 vendor/github.com/docker/docker/client/container_export.go create mode 100644 vendor/github.com/docker/docker/client/container_inspect.go create mode 100644 vendor/github.com/docker/docker/client/container_kill.go create mode 100644 vendor/github.com/docker/docker/client/container_list.go create mode 100644 vendor/github.com/docker/docker/client/container_logs.go create mode 100644 vendor/github.com/docker/docker/client/container_pause.go create mode 100644 vendor/github.com/docker/docker/client/container_prune.go create mode 100644 vendor/github.com/docker/docker/client/container_remove.go create mode 100644 vendor/github.com/docker/docker/client/container_rename.go create mode 100644 vendor/github.com/docker/docker/client/container_resize.go create mode 100644 vendor/github.com/docker/docker/client/container_restart.go create mode 100644 vendor/github.com/docker/docker/client/container_start.go create mode 100644 vendor/github.com/docker/docker/client/container_stats.go create mode 100644 vendor/github.com/docker/docker/client/container_stop.go create mode 100644 vendor/github.com/docker/docker/client/container_top.go create mode 100644 vendor/github.com/docker/docker/client/container_unpause.go create mode 100644 vendor/github.com/docker/docker/client/container_update.go create mode 100644 vendor/github.com/docker/docker/client/container_wait.go create mode 100644 vendor/github.com/docker/docker/client/disk_usage.go create mode 100644 vendor/github.com/docker/docker/client/distribution_inspect.go create mode 100644 vendor/github.com/docker/docker/client/envvars.go create mode 100644 vendor/github.com/docker/docker/client/errors.go create mode 100644 vendor/github.com/docker/docker/client/events.go create mode 100644 vendor/github.com/docker/docker/client/hijack.go create mode 100644 vendor/github.com/docker/docker/client/image_build.go create mode 100644 vendor/github.com/docker/docker/client/image_create.go create mode 100644 vendor/github.com/docker/docker/client/image_history.go create mode 100644 vendor/github.com/docker/docker/client/image_import.go create mode 100644 vendor/github.com/docker/docker/client/image_inspect.go create mode 100644 vendor/github.com/docker/docker/client/image_list.go create mode 100644 vendor/github.com/docker/docker/client/image_load.go create mode 100644 vendor/github.com/docker/docker/client/image_prune.go create mode 100644 vendor/github.com/docker/docker/client/image_pull.go create mode 100644 vendor/github.com/docker/docker/client/image_push.go create mode 100644 vendor/github.com/docker/docker/client/image_remove.go create mode 100644 vendor/github.com/docker/docker/client/image_save.go create mode 100644 vendor/github.com/docker/docker/client/image_search.go create mode 100644 vendor/github.com/docker/docker/client/image_tag.go create mode 100644 vendor/github.com/docker/docker/client/info.go create mode 100644 vendor/github.com/docker/docker/client/interface.go create mode 100644 vendor/github.com/docker/docker/client/interface_experimental.go create mode 100644 vendor/github.com/docker/docker/client/interface_stable.go create mode 100644 vendor/github.com/docker/docker/client/login.go create mode 100644 vendor/github.com/docker/docker/client/network_connect.go create mode 100644 vendor/github.com/docker/docker/client/network_create.go create mode 100644 vendor/github.com/docker/docker/client/network_disconnect.go create mode 100644 vendor/github.com/docker/docker/client/network_inspect.go create mode 100644 vendor/github.com/docker/docker/client/network_list.go create mode 100644 vendor/github.com/docker/docker/client/network_prune.go create mode 100644 vendor/github.com/docker/docker/client/network_remove.go create mode 100644 vendor/github.com/docker/docker/client/node_inspect.go create mode 100644 vendor/github.com/docker/docker/client/node_list.go create mode 100644 vendor/github.com/docker/docker/client/node_remove.go create mode 100644 vendor/github.com/docker/docker/client/node_update.go create mode 100644 vendor/github.com/docker/docker/client/options.go create mode 100644 vendor/github.com/docker/docker/client/ping.go create mode 100644 vendor/github.com/docker/docker/client/plugin_create.go create mode 100644 vendor/github.com/docker/docker/client/plugin_disable.go create mode 100644 vendor/github.com/docker/docker/client/plugin_enable.go create mode 100644 vendor/github.com/docker/docker/client/plugin_inspect.go create mode 100644 vendor/github.com/docker/docker/client/plugin_install.go create mode 100644 vendor/github.com/docker/docker/client/plugin_list.go create mode 100644 vendor/github.com/docker/docker/client/plugin_push.go create mode 100644 vendor/github.com/docker/docker/client/plugin_remove.go create mode 100644 vendor/github.com/docker/docker/client/plugin_set.go create mode 100644 vendor/github.com/docker/docker/client/plugin_upgrade.go create mode 100644 vendor/github.com/docker/docker/client/request.go create mode 100644 vendor/github.com/docker/docker/client/secret_create.go create mode 100644 vendor/github.com/docker/docker/client/secret_inspect.go create mode 100644 vendor/github.com/docker/docker/client/secret_list.go create mode 100644 vendor/github.com/docker/docker/client/secret_remove.go create mode 100644 vendor/github.com/docker/docker/client/secret_update.go create mode 100644 vendor/github.com/docker/docker/client/service_create.go create mode 100644 vendor/github.com/docker/docker/client/service_inspect.go create mode 100644 vendor/github.com/docker/docker/client/service_list.go create mode 100644 vendor/github.com/docker/docker/client/service_logs.go create mode 100644 vendor/github.com/docker/docker/client/service_remove.go create mode 100644 vendor/github.com/docker/docker/client/service_update.go create mode 100644 vendor/github.com/docker/docker/client/swarm_get_unlock_key.go create mode 100644 vendor/github.com/docker/docker/client/swarm_init.go create mode 100644 vendor/github.com/docker/docker/client/swarm_inspect.go create mode 100644 vendor/github.com/docker/docker/client/swarm_join.go create mode 100644 vendor/github.com/docker/docker/client/swarm_leave.go create mode 100644 vendor/github.com/docker/docker/client/swarm_unlock.go create mode 100644 vendor/github.com/docker/docker/client/swarm_update.go create mode 100644 vendor/github.com/docker/docker/client/task_inspect.go create mode 100644 vendor/github.com/docker/docker/client/task_list.go create mode 100644 vendor/github.com/docker/docker/client/task_logs.go create mode 100644 vendor/github.com/docker/docker/client/transport.go create mode 100644 vendor/github.com/docker/docker/client/utils.go create mode 100644 vendor/github.com/docker/docker/client/version.go create mode 100644 vendor/github.com/docker/docker/client/volume_create.go create mode 100644 vendor/github.com/docker/docker/client/volume_inspect.go create mode 100644 vendor/github.com/docker/docker/client/volume_list.go create mode 100644 vendor/github.com/docker/docker/client/volume_prune.go create mode 100644 vendor/github.com/docker/docker/client/volume_remove.go create mode 100644 vendor/github.com/docker/docker/client/volume_update.go create mode 100644 vendor/github.com/docker/docker/errdefs/defs.go create mode 100644 vendor/github.com/docker/docker/errdefs/doc.go create mode 100644 vendor/github.com/docker/docker/errdefs/helpers.go create mode 100644 vendor/github.com/docker/docker/errdefs/http_helpers.go create mode 100644 vendor/github.com/docker/docker/errdefs/is.go create mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go create mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_others.go create mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go create mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_windows.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/buffer.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fswriters.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/readers.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/tempdir_deprecated.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writers.go create mode 100644 vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go create mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath.go create mode 100644 vendor/github.com/docker/docker/registry/auth.go create mode 100644 vendor/github.com/docker/docker/registry/config.go create mode 100644 vendor/github.com/docker/docker/registry/config_unix.go create mode 100644 vendor/github.com/docker/docker/registry/config_windows.go create mode 100644 vendor/github.com/docker/docker/registry/endpoint_v1.go create mode 100644 vendor/github.com/docker/docker/registry/errors.go create mode 100644 vendor/github.com/docker/docker/registry/registry.go create mode 100644 vendor/github.com/docker/docker/registry/search.go create mode 100644 vendor/github.com/docker/docker/registry/service.go create mode 100644 vendor/github.com/docker/docker/registry/service_v2.go create mode 100644 vendor/github.com/docker/docker/registry/session.go create mode 100644 vendor/github.com/docker/docker/registry/types.go create mode 100644 vendor/github.com/docker/go-connections/LICENSE create mode 100644 vendor/github.com/docker/go-connections/nat/nat.go create mode 100644 vendor/github.com/docker/go-connections/nat/parse.go create mode 100644 vendor/github.com/docker/go-connections/nat/sort.go create mode 100644 vendor/github.com/docker/go-connections/sockets/README.md create mode 100644 vendor/github.com/docker/go-connections/sockets/inmem_socket.go create mode 100644 vendor/github.com/docker/go-connections/sockets/proxy.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_unix.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_windows.go create mode 100644 vendor/github.com/docker/go-connections/sockets/tcp_socket.go create mode 100644 vendor/github.com/docker/go-connections/sockets/unix_socket.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go create mode 100644 vendor/github.com/docker/go-metrics/CONTRIBUTING.md create mode 100644 vendor/github.com/docker/go-metrics/LICENSE create mode 100644 vendor/github.com/docker/go-metrics/LICENSE.docs create mode 100644 vendor/github.com/docker/go-metrics/NOTICE create mode 100644 vendor/github.com/docker/go-metrics/README.md create mode 100644 vendor/github.com/docker/go-metrics/counter.go create mode 100644 vendor/github.com/docker/go-metrics/docs.go create mode 100644 vendor/github.com/docker/go-metrics/gauge.go create mode 100644 vendor/github.com/docker/go-metrics/handler.go create mode 100644 vendor/github.com/docker/go-metrics/helpers.go create mode 100644 vendor/github.com/docker/go-metrics/namespace.go create mode 100644 vendor/github.com/docker/go-metrics/register.go create mode 100644 vendor/github.com/docker/go-metrics/timer.go create mode 100644 vendor/github.com/docker/go-metrics/unit.go create mode 100644 vendor/github.com/docker/go-units/CONTRIBUTING.md create mode 100644 vendor/github.com/docker/go-units/LICENSE create mode 100644 vendor/github.com/docker/go-units/MAINTAINERS create mode 100644 vendor/github.com/docker/go-units/README.md create mode 100644 vendor/github.com/docker/go-units/circle.yml create mode 100644 vendor/github.com/docker/go-units/duration.go create mode 100644 vendor/github.com/docker/go-units/size.go create mode 100644 vendor/github.com/docker/go-units/ulimit.go create mode 100644 vendor/github.com/docker/go/LICENSE create mode 100644 vendor/github.com/docker/go/canonical/json/decode.go create mode 100644 vendor/github.com/docker/go/canonical/json/encode.go create mode 100644 vendor/github.com/docker/go/canonical/json/fold.go create mode 100644 vendor/github.com/docker/go/canonical/json/indent.go create mode 100644 vendor/github.com/docker/go/canonical/json/scanner.go create mode 100644 vendor/github.com/docker/go/canonical/json/stream.go create mode 100644 vendor/github.com/docker/go/canonical/json/tags.go create mode 100644 vendor/github.com/fvbommel/sortorder/.gitignore create mode 100644 vendor/github.com/fvbommel/sortorder/LICENSE create mode 100644 vendor/github.com/fvbommel/sortorder/README.md create mode 100644 vendor/github.com/fvbommel/sortorder/doc.go create mode 100644 vendor/github.com/fvbommel/sortorder/natsort.go create mode 100644 vendor/github.com/gogo/protobuf/AUTHORS create mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/gogo/protobuf/LICENSE create mode 100644 vendor/github.com/gogo/protobuf/proto/Makefile create mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go create mode 100644 vendor/github.com/gogo/protobuf/proto/custom_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/gogo/protobuf/proto/discard.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go create mode 100644 vendor/github.com/golang/protobuf/AUTHORS create mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/golang/protobuf/LICENSE create mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go create mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go create mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/golang/protobuf/proto/discard.go create mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 vendor/github.com/golang/protobuf/proto/proto.go create mode 100644 vendor/github.com/golang/protobuf/proto/registry.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go create mode 100644 vendor/github.com/golang/protobuf/proto/wire.go create mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 vendor/github.com/gorilla/mux/AUTHORS create mode 100644 vendor/github.com/gorilla/mux/LICENSE create mode 100644 vendor/github.com/gorilla/mux/README.md create mode 100644 vendor/github.com/gorilla/mux/doc.go create mode 100644 vendor/github.com/gorilla/mux/middleware.go create mode 100644 vendor/github.com/gorilla/mux/mux.go create mode 100644 vendor/github.com/gorilla/mux/regexp.go create mode 100644 vendor/github.com/gorilla/mux/route.go create mode 100644 vendor/github.com/gorilla/mux/test_helpers.go create mode 100644 vendor/github.com/inconshreveable/mousetrap/LICENSE create mode 100644 vendor/github.com/inconshreveable/mousetrap/README.md create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_others.go create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows.go create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go create mode 100644 vendor/github.com/mattn/go-colorable/LICENSE create mode 100644 vendor/github.com/mattn/go-colorable/README.md create mode 100644 vendor/github.com/mattn/go-colorable/colorable_appengine.go create mode 100644 vendor/github.com/mattn/go-colorable/colorable_others.go create mode 100644 vendor/github.com/mattn/go-colorable/colorable_windows.go create mode 100644 vendor/github.com/mattn/go-colorable/go.test.sh create mode 100644 vendor/github.com/mattn/go-colorable/noncolorable.go create mode 100644 vendor/github.com/mattn/go-isatty/LICENSE create mode 100644 vendor/github.com/mattn/go-isatty/README.md create mode 100644 vendor/github.com/mattn/go-isatty/doc.go create mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh create mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 vendor/github.com/miekg/pkcs11/.gitignore create mode 100644 vendor/github.com/miekg/pkcs11/.travis.yml create mode 100644 vendor/github.com/miekg/pkcs11/LICENSE create mode 100644 vendor/github.com/miekg/pkcs11/Makefile.release create mode 100644 vendor/github.com/miekg/pkcs11/README.md create mode 100644 vendor/github.com/miekg/pkcs11/const.go create mode 100644 vendor/github.com/miekg/pkcs11/error.go create mode 100644 vendor/github.com/miekg/pkcs11/hsm.db create mode 100644 vendor/github.com/miekg/pkcs11/params.go create mode 100644 vendor/github.com/miekg/pkcs11/pkcs11.go create mode 100644 vendor/github.com/miekg/pkcs11/pkcs11.h create mode 100644 vendor/github.com/miekg/pkcs11/pkcs11f.h create mode 100644 vendor/github.com/miekg/pkcs11/pkcs11go.h create mode 100644 vendor/github.com/miekg/pkcs11/pkcs11t.h create mode 100644 vendor/github.com/miekg/pkcs11/release.go create mode 100644 vendor/github.com/miekg/pkcs11/softhsm.conf create mode 100644 vendor/github.com/miekg/pkcs11/softhsm2.conf create mode 100644 vendor/github.com/miekg/pkcs11/types.go create mode 100644 vendor/github.com/miekg/pkcs11/vendor.go create mode 100644 vendor/github.com/mitchellh/mapstructure/CHANGELOG.md create mode 100644 vendor/github.com/mitchellh/mapstructure/LICENSE create mode 100644 vendor/github.com/mitchellh/mapstructure/README.md create mode 100644 vendor/github.com/mitchellh/mapstructure/decode_hooks.go create mode 100644 vendor/github.com/mitchellh/mapstructure/error.go create mode 100644 vendor/github.com/mitchellh/mapstructure/mapstructure.go create mode 100644 vendor/github.com/moby/sys/sequential/LICENSE create mode 100644 vendor/github.com/moby/sys/sequential/doc.go create mode 100644 vendor/github.com/moby/sys/sequential/sequential_unix.go create mode 100644 vendor/github.com/moby/sys/sequential/sequential_windows.go create mode 100644 vendor/github.com/moby/term/.gitignore create mode 100644 vendor/github.com/moby/term/LICENSE create mode 100644 vendor/github.com/moby/term/README.md create mode 100644 vendor/github.com/moby/term/ascii.go create mode 100644 vendor/github.com/moby/term/proxy.go create mode 100644 vendor/github.com/moby/term/tc.go create mode 100644 vendor/github.com/moby/term/term.go create mode 100644 vendor/github.com/moby/term/term_windows.go create mode 100644 vendor/github.com/moby/term/termios.go create mode 100644 vendor/github.com/moby/term/termios_bsd.go create mode 100644 vendor/github.com/moby/term/termios_nonbsd.go create mode 100644 vendor/github.com/moby/term/windows/ansi_reader.go create mode 100644 vendor/github.com/moby/term/windows/ansi_writer.go create mode 100644 vendor/github.com/moby/term/windows/console.go create mode 100644 vendor/github.com/moby/term/windows/doc.go create mode 100644 vendor/github.com/moby/term/winsize.go create mode 100644 vendor/github.com/morikuni/aec/LICENSE create mode 100644 vendor/github.com/morikuni/aec/README.md create mode 100644 vendor/github.com/morikuni/aec/aec.go create mode 100644 vendor/github.com/morikuni/aec/ansi.go create mode 100644 vendor/github.com/morikuni/aec/builder.go create mode 100644 vendor/github.com/morikuni/aec/sample.gif create mode 100644 vendor/github.com/morikuni/aec/sgr.go create mode 100644 vendor/github.com/opencontainers/go-digest/.mailmap create mode 100644 vendor/github.com/opencontainers/go-digest/.pullapprove.yml create mode 100644 vendor/github.com/opencontainers/go-digest/.travis.yml create mode 100644 vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md create mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE create mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE.docs create mode 100644 vendor/github.com/opencontainers/go-digest/MAINTAINERS create mode 100644 vendor/github.com/opencontainers/go-digest/README.md create mode 100644 vendor/github.com/opencontainers/go-digest/algorithm.go create mode 100644 vendor/github.com/opencontainers/go-digest/digest.go create mode 100644 vendor/github.com/opencontainers/go-digest/digester.go create mode 100644 vendor/github.com/opencontainers/go-digest/digestset/set.go create mode 100644 vendor/github.com/opencontainers/go-digest/doc.go create mode 100644 vendor/github.com/opencontainers/go-digest/verifiers.go create mode 100644 vendor/github.com/opencontainers/image-spec/LICENSE create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/layout.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/version.go create mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/versioned.go create mode 100644 vendor/github.com/pkg/errors/.gitignore create mode 100644 vendor/github.com/pkg/errors/.travis.yml create mode 100644 vendor/github.com/pkg/errors/LICENSE create mode 100644 vendor/github.com/pkg/errors/Makefile create mode 100644 vendor/github.com/pkg/errors/README.md create mode 100644 vendor/github.com/pkg/errors/appveyor.yml create mode 100644 vendor/github.com/pkg/errors/errors.go create mode 100644 vendor/github.com/pkg/errors/go113.go create mode 100644 vendor/github.com/pkg/errors/stack.go create mode 100644 vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/.gitignore create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/README.md create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE create mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 vendor/github.com/prometheus/common/LICENSE create mode 100644 vendor/github.com/prometheus/common/NOTICE create mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 vendor/github.com/prometheus/common/expfmt/openmetrics_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/prometheus/common/model/alert.go create mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 vendor/github.com/prometheus/common/model/fnv.go create mode 100644 vendor/github.com/prometheus/common/model/labels.go create mode 100644 vendor/github.com/prometheus/common/model/labelset.go create mode 100644 vendor/github.com/prometheus/common/model/metric.go create mode 100644 vendor/github.com/prometheus/common/model/model.go create mode 100644 vendor/github.com/prometheus/common/model/signature.go create mode 100644 vendor/github.com/prometheus/common/model/silence.go create mode 100644 vendor/github.com/prometheus/common/model/time.go create mode 100644 vendor/github.com/prometheus/common/model/value.go create mode 100644 vendor/github.com/prometheus/procfs/.gitignore create mode 100644 vendor/github.com/prometheus/procfs/.golangci.yml create mode 100644 vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/prometheus/procfs/CONTRIBUTING.md create mode 100644 vendor/github.com/prometheus/procfs/LICENSE create mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 vendor/github.com/prometheus/procfs/Makefile create mode 100644 vendor/github.com/prometheus/procfs/Makefile.common create mode 100644 vendor/github.com/prometheus/procfs/NOTICE create mode 100644 vendor/github.com/prometheus/procfs/README.md create mode 100644 vendor/github.com/prometheus/procfs/SECURITY.md create mode 100644 vendor/github.com/prometheus/procfs/arp.go create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_armx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_others.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_s390x.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo_x86.go create mode 100644 vendor/github.com/prometheus/procfs/crypto.go create mode 100644 vendor/github.com/prometheus/procfs/doc.go create mode 100644 vendor/github.com/prometheus/procfs/fixtures.ttar create mode 100644 vendor/github.com/prometheus/procfs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/fscache.go create mode 100644 vendor/github.com/prometheus/procfs/internal/fs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/parse.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/readfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/valueparser.go create mode 100644 vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 vendor/github.com/prometheus/procfs/kernel_random.go create mode 100644 vendor/github.com/prometheus/procfs/loadavg.go create mode 100644 vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 vendor/github.com/prometheus/procfs/meminfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountinfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 vendor/github.com/prometheus/procfs/net_conntrackstat.go create mode 100644 vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 vendor/github.com/prometheus/procfs/net_ip_socket.go create mode 100644 vendor/github.com/prometheus/procfs/net_protocols.go create mode 100644 vendor/github.com/prometheus/procfs/net_sockstat.go create mode 100644 vendor/github.com/prometheus/procfs/net_softnet.go create mode 100644 vendor/github.com/prometheus/procfs/net_tcp.go create mode 100644 vendor/github.com/prometheus/procfs/net_udp.go create mode 100644 vendor/github.com/prometheus/procfs/net_unix.go create mode 100644 vendor/github.com/prometheus/procfs/proc.go create mode 100644 vendor/github.com/prometheus/procfs/proc_cgroup.go create mode 100644 vendor/github.com/prometheus/procfs/proc_environ.go create mode 100644 vendor/github.com/prometheus/procfs/proc_fdinfo.go create mode 100644 vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 vendor/github.com/prometheus/procfs/proc_maps.go create mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 vendor/github.com/prometheus/procfs/proc_psi.go create mode 100644 vendor/github.com/prometheus/procfs/proc_smaps.go create mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 vendor/github.com/prometheus/procfs/proc_status.go create mode 100644 vendor/github.com/prometheus/procfs/schedstat.go create mode 100644 vendor/github.com/prometheus/procfs/slab.go create mode 100644 vendor/github.com/prometheus/procfs/stat.go create mode 100644 vendor/github.com/prometheus/procfs/swaps.go create mode 100644 vendor/github.com/prometheus/procfs/ttar create mode 100644 vendor/github.com/prometheus/procfs/vm.go create mode 100644 vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 vendor/github.com/prometheus/procfs/zoneinfo.go create mode 100644 vendor/github.com/robfig/cron/v3/.gitignore create mode 100644 vendor/github.com/robfig/cron/v3/.travis.yml create mode 100644 vendor/github.com/robfig/cron/v3/LICENSE create mode 100644 vendor/github.com/robfig/cron/v3/README.md create mode 100644 vendor/github.com/robfig/cron/v3/chain.go create mode 100644 vendor/github.com/robfig/cron/v3/constantdelay.go create mode 100644 vendor/github.com/robfig/cron/v3/cron.go create mode 100644 vendor/github.com/robfig/cron/v3/doc.go create mode 100644 vendor/github.com/robfig/cron/v3/logger.go create mode 100644 vendor/github.com/robfig/cron/v3/option.go create mode 100644 vendor/github.com/robfig/cron/v3/parser.go create mode 100644 vendor/github.com/robfig/cron/v3/spec.go create mode 100644 vendor/github.com/rs/zerolog/.gitignore create mode 100644 vendor/github.com/rs/zerolog/CNAME create mode 100644 vendor/github.com/rs/zerolog/LICENSE create mode 100644 vendor/github.com/rs/zerolog/README.md create mode 100644 vendor/github.com/rs/zerolog/_config.yml create mode 100644 vendor/github.com/rs/zerolog/array.go create mode 100644 vendor/github.com/rs/zerolog/console.go create mode 100644 vendor/github.com/rs/zerolog/context.go create mode 100644 vendor/github.com/rs/zerolog/ctx.go create mode 100644 vendor/github.com/rs/zerolog/encoder.go create mode 100644 vendor/github.com/rs/zerolog/encoder_cbor.go create mode 100644 vendor/github.com/rs/zerolog/encoder_json.go create mode 100644 vendor/github.com/rs/zerolog/event.go create mode 100644 vendor/github.com/rs/zerolog/example.jsonl create mode 100644 vendor/github.com/rs/zerolog/fields.go create mode 100644 vendor/github.com/rs/zerolog/globals.go create mode 100644 vendor/github.com/rs/zerolog/go112.go create mode 100644 vendor/github.com/rs/zerolog/hook.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/README.md create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/base.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/cbor.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/decode_stream.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/string.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/time.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/types.go create mode 100644 vendor/github.com/rs/zerolog/internal/json/base.go create mode 100644 vendor/github.com/rs/zerolog/internal/json/bytes.go create mode 100644 vendor/github.com/rs/zerolog/internal/json/string.go create mode 100644 vendor/github.com/rs/zerolog/internal/json/time.go create mode 100644 vendor/github.com/rs/zerolog/internal/json/types.go create mode 100644 vendor/github.com/rs/zerolog/log.go create mode 100644 vendor/github.com/rs/zerolog/log/log.go create mode 100644 vendor/github.com/rs/zerolog/not_go112.go create mode 100644 vendor/github.com/rs/zerolog/pretty.png create mode 100644 vendor/github.com/rs/zerolog/sampler.go create mode 100644 vendor/github.com/rs/zerolog/syslog.go create mode 100644 vendor/github.com/rs/zerolog/writer.go create mode 100644 vendor/github.com/sirupsen/logrus/.gitignore create mode 100644 vendor/github.com/sirupsen/logrus/.golangci.yml create mode 100644 vendor/github.com/sirupsen/logrus/.travis.yml create mode 100644 vendor/github.com/sirupsen/logrus/CHANGELOG.md create mode 100644 vendor/github.com/sirupsen/logrus/LICENSE create mode 100644 vendor/github.com/sirupsen/logrus/README.md create mode 100644 vendor/github.com/sirupsen/logrus/alt_exit.go create mode 100644 vendor/github.com/sirupsen/logrus/appveyor.yml create mode 100644 vendor/github.com/sirupsen/logrus/buffer_pool.go create mode 100644 vendor/github.com/sirupsen/logrus/doc.go create mode 100644 vendor/github.com/sirupsen/logrus/entry.go create mode 100644 vendor/github.com/sirupsen/logrus/exported.go create mode 100644 vendor/github.com/sirupsen/logrus/formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/hooks.go create mode 100644 vendor/github.com/sirupsen/logrus/json_formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/logger.go create mode 100644 vendor/github.com/sirupsen/logrus/logrus.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_appengine.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_bsd.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_js.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_unix.go create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_windows.go create mode 100644 vendor/github.com/sirupsen/logrus/text_formatter.go create mode 100644 vendor/github.com/sirupsen/logrus/writer.go create mode 100644 vendor/github.com/spf13/cobra/.gitignore create mode 100644 vendor/github.com/spf13/cobra/.golangci.yml create mode 100644 vendor/github.com/spf13/cobra/.mailmap create mode 100644 vendor/github.com/spf13/cobra/CHANGELOG.md create mode 100644 vendor/github.com/spf13/cobra/CONDUCT.md create mode 100644 vendor/github.com/spf13/cobra/CONTRIBUTING.md create mode 100644 vendor/github.com/spf13/cobra/LICENSE.txt create mode 100644 vendor/github.com/spf13/cobra/Makefile create mode 100644 vendor/github.com/spf13/cobra/README.md create mode 100644 vendor/github.com/spf13/cobra/args.go create mode 100644 vendor/github.com/spf13/cobra/bash_completions.go create mode 100644 vendor/github.com/spf13/cobra/bash_completions.md create mode 100644 vendor/github.com/spf13/cobra/bash_completionsV2.go create mode 100644 vendor/github.com/spf13/cobra/cobra.go create mode 100644 vendor/github.com/spf13/cobra/command.go create mode 100644 vendor/github.com/spf13/cobra/command_notwin.go create mode 100644 vendor/github.com/spf13/cobra/command_win.go create mode 100644 vendor/github.com/spf13/cobra/completions.go create mode 100644 vendor/github.com/spf13/cobra/fish_completions.go create mode 100644 vendor/github.com/spf13/cobra/fish_completions.md create mode 100644 vendor/github.com/spf13/cobra/powershell_completions.go create mode 100644 vendor/github.com/spf13/cobra/powershell_completions.md create mode 100644 vendor/github.com/spf13/cobra/projects_using_cobra.md create mode 100644 vendor/github.com/spf13/cobra/shell_completions.go create mode 100644 vendor/github.com/spf13/cobra/shell_completions.md create mode 100644 vendor/github.com/spf13/cobra/user_guide.md create mode 100644 vendor/github.com/spf13/cobra/zsh_completions.go create mode 100644 vendor/github.com/spf13/cobra/zsh_completions.md create mode 100644 vendor/github.com/spf13/pflag/.gitignore create mode 100644 vendor/github.com/spf13/pflag/.travis.yml create mode 100644 vendor/github.com/spf13/pflag/LICENSE create mode 100644 vendor/github.com/spf13/pflag/README.md create mode 100644 vendor/github.com/spf13/pflag/bool.go create mode 100644 vendor/github.com/spf13/pflag/bool_slice.go create mode 100644 vendor/github.com/spf13/pflag/bytes.go create mode 100644 vendor/github.com/spf13/pflag/count.go create mode 100644 vendor/github.com/spf13/pflag/duration.go create mode 100644 vendor/github.com/spf13/pflag/duration_slice.go create mode 100644 vendor/github.com/spf13/pflag/flag.go create mode 100644 vendor/github.com/spf13/pflag/float32.go create mode 100644 vendor/github.com/spf13/pflag/float32_slice.go create mode 100644 vendor/github.com/spf13/pflag/float64.go create mode 100644 vendor/github.com/spf13/pflag/float64_slice.go create mode 100644 vendor/github.com/spf13/pflag/golangflag.go create mode 100644 vendor/github.com/spf13/pflag/int.go create mode 100644 vendor/github.com/spf13/pflag/int16.go create mode 100644 vendor/github.com/spf13/pflag/int32.go create mode 100644 vendor/github.com/spf13/pflag/int32_slice.go create mode 100644 vendor/github.com/spf13/pflag/int64.go create mode 100644 vendor/github.com/spf13/pflag/int64_slice.go create mode 100644 vendor/github.com/spf13/pflag/int8.go create mode 100644 vendor/github.com/spf13/pflag/int_slice.go create mode 100644 vendor/github.com/spf13/pflag/ip.go create mode 100644 vendor/github.com/spf13/pflag/ip_slice.go create mode 100644 vendor/github.com/spf13/pflag/ipmask.go create mode 100644 vendor/github.com/spf13/pflag/ipnet.go create mode 100644 vendor/github.com/spf13/pflag/string.go create mode 100644 vendor/github.com/spf13/pflag/string_array.go create mode 100644 vendor/github.com/spf13/pflag/string_slice.go create mode 100644 vendor/github.com/spf13/pflag/string_to_int.go create mode 100644 vendor/github.com/spf13/pflag/string_to_int64.go create mode 100644 vendor/github.com/spf13/pflag/string_to_string.go create mode 100644 vendor/github.com/spf13/pflag/uint.go create mode 100644 vendor/github.com/spf13/pflag/uint16.go create mode 100644 vendor/github.com/spf13/pflag/uint32.go create mode 100644 vendor/github.com/spf13/pflag/uint64.go create mode 100644 vendor/github.com/spf13/pflag/uint8.go create mode 100644 vendor/github.com/spf13/pflag/uint_slice.go create mode 100644 vendor/github.com/theupdateframework/notary/.gitignore create mode 100644 vendor/github.com/theupdateframework/notary/CHANGELOG.md create mode 100644 vendor/github.com/theupdateframework/notary/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/theupdateframework/notary/CONTRIBUTING.md create mode 100644 vendor/github.com/theupdateframework/notary/CONTRIBUTORS create mode 100644 vendor/github.com/theupdateframework/notary/Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/Jenkinsfile create mode 100644 vendor/github.com/theupdateframework/notary/LICENSE create mode 100644 vendor/github.com/theupdateframework/notary/MAINTAINERS create mode 100644 vendor/github.com/theupdateframework/notary/MAINTAINERS.ALUMNI create mode 100644 vendor/github.com/theupdateframework/notary/MAINTAINERS_RULES.md create mode 100644 vendor/github.com/theupdateframework/notary/Makefile create mode 100644 vendor/github.com/theupdateframework/notary/NOTARY_VERSION create mode 100644 vendor/github.com/theupdateframework/notary/README.md create mode 100644 vendor/github.com/theupdateframework/notary/client/changelist/change.go create mode 100644 vendor/github.com/theupdateframework/notary/client/changelist/changelist.go create mode 100644 vendor/github.com/theupdateframework/notary/client/changelist/file_changelist.go create mode 100644 vendor/github.com/theupdateframework/notary/client/changelist/interface.go create mode 100644 vendor/github.com/theupdateframework/notary/client/client.go create mode 100644 vendor/github.com/theupdateframework/notary/client/delegations.go create mode 100644 vendor/github.com/theupdateframework/notary/client/errors.go create mode 100644 vendor/github.com/theupdateframework/notary/client/helpers.go create mode 100644 vendor/github.com/theupdateframework/notary/client/interface.go create mode 100644 vendor/github.com/theupdateframework/notary/client/reader.go create mode 100644 vendor/github.com/theupdateframework/notary/client/repo.go create mode 100644 vendor/github.com/theupdateframework/notary/client/repo_pkcs11.go create mode 100644 vendor/github.com/theupdateframework/notary/client/tufclient.go create mode 100644 vendor/github.com/theupdateframework/notary/client/witness.go create mode 100644 vendor/github.com/theupdateframework/notary/codecov.yml create mode 100644 vendor/github.com/theupdateframework/notary/const.go create mode 100644 vendor/github.com/theupdateframework/notary/const_nowindows.go create mode 100644 vendor/github.com/theupdateframework/notary/const_windows.go create mode 100644 vendor/github.com/theupdateframework/notary/cross.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/cryptoservice/certificate.go create mode 100644 vendor/github.com/theupdateframework/notary/cryptoservice/crypto_service.go create mode 100644 vendor/github.com/theupdateframework/notary/development.mysql.yml create mode 100644 vendor/github.com/theupdateframework/notary/development.postgresql.yml create mode 100644 vendor/github.com/theupdateframework/notary/development.rethink.yml create mode 100644 vendor/github.com/theupdateframework/notary/docker-compose.postgresql.yml create mode 100644 vendor/github.com/theupdateframework/notary/docker-compose.rethink.yml create mode 100644 vendor/github.com/theupdateframework/notary/docker-compose.yml create mode 100644 vendor/github.com/theupdateframework/notary/escrow.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/fips.go create mode 100644 vendor/github.com/theupdateframework/notary/notary.go create mode 100644 vendor/github.com/theupdateframework/notary/passphrase/passphrase.go create mode 100644 vendor/github.com/theupdateframework/notary/server.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/server.minimal.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/signer.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/signer.minimal.Dockerfile create mode 100644 vendor/github.com/theupdateframework/notary/storage/errors.go create mode 100644 vendor/github.com/theupdateframework/notary/storage/filestore.go create mode 100644 vendor/github.com/theupdateframework/notary/storage/httpstore.go create mode 100644 vendor/github.com/theupdateframework/notary/storage/interfaces.go create mode 100644 vendor/github.com/theupdateframework/notary/storage/memorystore.go create mode 100644 vendor/github.com/theupdateframework/notary/storage/offlinestore.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/errors.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/importLogic.md create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/interfaces.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/keys.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/keystore.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/import.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/non_pkcs11.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/pkcs11_darwin.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/pkcs11_interface.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/pkcs11_linux.go create mode 100644 vendor/github.com/theupdateframework/notary/trustmanager/yubikey/yubikeystore.go create mode 100644 vendor/github.com/theupdateframework/notary/trustpinning/ca.crt create mode 100644 vendor/github.com/theupdateframework/notary/trustpinning/certs.go create mode 100644 vendor/github.com/theupdateframework/notary/trustpinning/test.crt create mode 100644 vendor/github.com/theupdateframework/notary/trustpinning/trustpin.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/LICENSE create mode 100644 vendor/github.com/theupdateframework/notary/tuf/README.md create mode 100644 vendor/github.com/theupdateframework/notary/tuf/builder.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/errors.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/keys.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/roles.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/root.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/serializer.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/snapshot.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/targets.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/timestamp.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/data/types.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/ed25519.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/errors.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/interface.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/sign.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/verifiers.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/signed/verify.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/tuf.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/utils/pkcs8.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/utils/role_sort.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/utils/stack.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/utils/utils.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/utils/x509.go create mode 100644 vendor/github.com/theupdateframework/notary/tuf/validation/errors.go create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/ed25519/ed25519.go create mode 100644 vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go create mode 100644 vendor/golang.org/x/net/LICENSE create mode 100644 vendor/golang.org/x/net/PATENTS create mode 100644 vendor/golang.org/x/net/internal/socks/client.go create mode 100644 vendor/golang.org/x/net/internal/socks/socks.go create mode 100644 vendor/golang.org/x/net/proxy/dial.go create mode 100644 vendor/golang.org/x/net/proxy/direct.go create mode 100644 vendor/golang.org/x/net/proxy/per_host.go create mode 100644 vendor/golang.org/x/net/proxy/proxy.go create mode 100644 vendor/golang.org/x/net/proxy/socks5.go create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/execabs/execabs.go create mode 100644 vendor/golang.org/x/sys/execabs/execabs_go118.go create mode 100644 vendor/golang.org/x/sys/execabs/execabs_go119.go create mode 100644 vendor/golang.org/x/sys/plan9/asm.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_386.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_arm.s create mode 100644 vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/mkall.sh create mode 100644 vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/race.go create mode 100644 vendor/golang.org/x/sys/plan9/race0.go create mode 100644 vendor/golang.org/x/sys/plan9/str.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go create mode 100644 vendor/golang.org/x/sys/plan9/zsysnum_plan9.go create mode 100644 vendor/golang.org/x/sys/unix/.gitignore create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 vendor/golang.org/x/sys/unix/aliases.go create mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_loong64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 vendor/golang.org/x/sys/unix/bpxsvc_zos.go create mode 100644 vendor/golang.org/x/sys/unix/bpxsvc_zos.s create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/constants.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 vendor/golang.org/x/sys/unix/fdset.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_unsigned.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go create mode 100644 vendor/golang.org/x/sys/unix/mkall.sh create mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_ios.go create mode 100644 vendor/golang.org/x/sys/unix/race.go create mode 100644 vendor/golang.org/x/sys/unix/race0.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_zos.go create mode 100644 vendor/golang.org/x/sys/unix/symaddr_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/syscall.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_alarm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/windows/aliases.go create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 vendor/golang.org/x/sys/windows/mkerrors.bash create mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/race.go create mode 100644 vendor/golang.org/x/sys/windows/race0.go create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 vendor/golang.org/x/sys/windows/service.go create mode 100644 vendor/golang.org/x/sys/windows/setupapi_windows.go create mode 100644 vendor/golang.org/x/sys/windows/str.go create mode 100644 vendor/golang.org/x/sys/windows/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm64.go create mode 100644 vendor/golang.org/x/sys/windows/zerrors_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 vendor/golang.org/x/term/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/term/LICENSE create mode 100644 vendor/golang.org/x/term/PATENTS create mode 100644 vendor/golang.org/x/term/README.md create mode 100644 vendor/golang.org/x/term/codereview.cfg create mode 100644 vendor/golang.org/x/term/term.go create mode 100644 vendor/golang.org/x/term/term_plan9.go create mode 100644 vendor/golang.org/x/term/term_unix.go create mode 100644 vendor/golang.org/x/term/term_unix_bsd.go create mode 100644 vendor/golang.org/x/term/term_unix_other.go create mode 100644 vendor/golang.org/x/term/term_unsupported.go create mode 100644 vendor/golang.org/x/term/term_windows.go create mode 100644 vendor/golang.org/x/term/terminal.go create mode 100644 vendor/google.golang.org/protobuf/LICENSE create mode 100644 vendor/google.golang.org/protobuf/PATENTS create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/decode.go create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/doc.go create mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/encode.go create mode 100644 vendor/google.golang.org/protobuf/encoding/protowire/wire.go create mode 100644 vendor/google.golang.org/protobuf/internal/descfmt/stringer.go create mode 100644 vendor/google.golang.org/protobuf/internal/descopts/options.go create mode 100644 vendor/google.golang.org/protobuf/internal/detrand/rand.go create mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go create mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/defval/default.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/doc.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/encode.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/errors.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/build.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/editions.go create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go create mode 100644 vendor/google.golang.org/protobuf/internal/filetype/build.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/flags.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/any_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/api_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/doc.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/duration_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/empty_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/goname.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/map_entry.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/struct_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/type_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/checkinit.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_tables.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_list.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_map.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/decode.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/encode.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/enum.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_export.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_file.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/validate.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/weak.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/order.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/range.go create mode 100644 vendor/google.golang.org/protobuf/internal/pragma/pragma.go create mode 100644 vendor/google.golang.org/protobuf/internal/set/ints.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_pure.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go create mode 100644 vendor/google.golang.org/protobuf/internal/version/version.go create mode 100644 vendor/google.golang.org/protobuf/proto/checkinit.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/doc.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/equal.go create mode 100644 vendor/google.golang.org/protobuf/proto/extension.go create mode 100644 vendor/google.golang.org/protobuf/proto/merge.go create mode 100644 vendor/google.golang.org/protobuf/proto/messageset.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_methods.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_reflect.go create mode 100644 vendor/google.golang.org/protobuf/proto/reset.go create mode 100644 vendor/google.golang.org/protobuf/proto/size.go create mode 100644 vendor/google.golang.org/protobuf/proto/size_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/type.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/methods.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/version.go create mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.proto create mode 100644 vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go create mode 100644 vendor/modules.txt diff --git a/Dockerfile b/Dockerfile index d320e1bc..3a8380ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS base COPY --from=xx / / ENV CGO_ENABLED=0 +ENV GOFLAGS="-mod=vendor" RUN apk add --no-cache file git WORKDIR /src @@ -23,12 +24,7 @@ RUN --mount=target=. <&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor"' - echo "$diff" + if [ -n "$(git status --porcelain -- go.mod go.sum vendor)" ]; then + echo >&2 'ERROR: Vendor result differs. Please vendor your package with "make vendor"' + git status --porcelain -- go.mod go.sum vendor exit 1 fi EOT FROM psampaz/go-mod-outdated:${GOMOD_OUTDATED_VERSION} AS go-mod-outdated FROM base AS outdated -RUN --mount=type=bind,target=. \ +RUN --mount=type=bind,target=.,rw \ --mount=type=cache,target=/go/pkg/mod \ --mount=from=go-mod-outdated,source=/home/go-mod-outdated,target=/usr/bin/go-mod-outdated \ - go list -mod=readonly -u -m -json all | go-mod-outdated -update -direct + go list -mod=mod -u -m -json all | go-mod-outdated -update -direct diff --git a/vendor/github.com/Azure/go-ansiterm/LICENSE b/vendor/github.com/Azure/go-ansiterm/LICENSE new file mode 100644 index 00000000..e3d9a64d --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/Azure/go-ansiterm/README.md b/vendor/github.com/Azure/go-ansiterm/README.md new file mode 100644 index 00000000..261c041e --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/README.md @@ -0,0 +1,12 @@ +# go-ansiterm + +This is a cross platform Ansi Terminal Emulation library. It reads a stream of Ansi characters and produces the appropriate function calls. The results of the function calls are platform dependent. + +For example the parser might receive "ESC, [, A" as a stream of three characters. This is the code for Cursor Up (http://www.vt100.net/docs/vt510-rm/CUU). The parser then calls the cursor up function (CUU()) on an event handler. The event handler determines what platform specific work must be done to cause the cursor to move up one position. + +The parser (parser.go) is a partial implementation of this state machine (http://vt100.net/emu/vt500_parser.png). There are also two event handler implementations, one for tests (test_event_handler.go) to validate that the expected events are being produced and called, the other is a Windows implementation (winterm/win_event_handler.go). + +See parser_test.go for examples exercising the state machine and generating appropriate function calls. + +----- +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/vendor/github.com/Azure/go-ansiterm/constants.go b/vendor/github.com/Azure/go-ansiterm/constants.go new file mode 100644 index 00000000..96504a33 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/constants.go @@ -0,0 +1,188 @@ +package ansiterm + +const LogEnv = "DEBUG_TERMINAL" + +// ANSI constants +// References: +// -- http://www.ecma-international.org/publications/standards/Ecma-048.htm +// -- http://man7.org/linux/man-pages/man4/console_codes.4.html +// -- http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html +// -- http://en.wikipedia.org/wiki/ANSI_escape_code +// -- http://vt100.net/emu/dec_ansi_parser +// -- http://vt100.net/emu/vt500_parser.svg +// -- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html +// -- http://www.inwap.com/pdp10/ansicode.txt +const ( + // ECMA-48 Set Graphics Rendition + // Note: + // -- Constants leading with an underscore (e.g., _ANSI_xxx) are unsupported or reserved + // -- Fonts could possibly be supported via SetCurrentConsoleFontEx + // -- Windows does not expose the per-window cursor (i.e., caret) blink times + ANSI_SGR_RESET = 0 + ANSI_SGR_BOLD = 1 + ANSI_SGR_DIM = 2 + _ANSI_SGR_ITALIC = 3 + ANSI_SGR_UNDERLINE = 4 + _ANSI_SGR_BLINKSLOW = 5 + _ANSI_SGR_BLINKFAST = 6 + ANSI_SGR_REVERSE = 7 + _ANSI_SGR_INVISIBLE = 8 + _ANSI_SGR_LINETHROUGH = 9 + _ANSI_SGR_FONT_00 = 10 + _ANSI_SGR_FONT_01 = 11 + _ANSI_SGR_FONT_02 = 12 + _ANSI_SGR_FONT_03 = 13 + _ANSI_SGR_FONT_04 = 14 + _ANSI_SGR_FONT_05 = 15 + _ANSI_SGR_FONT_06 = 16 + _ANSI_SGR_FONT_07 = 17 + _ANSI_SGR_FONT_08 = 18 + _ANSI_SGR_FONT_09 = 19 + _ANSI_SGR_FONT_10 = 20 + _ANSI_SGR_DOUBLEUNDERLINE = 21 + ANSI_SGR_BOLD_DIM_OFF = 22 + _ANSI_SGR_ITALIC_OFF = 23 + ANSI_SGR_UNDERLINE_OFF = 24 + _ANSI_SGR_BLINK_OFF = 25 + _ANSI_SGR_RESERVED_00 = 26 + ANSI_SGR_REVERSE_OFF = 27 + _ANSI_SGR_INVISIBLE_OFF = 28 + _ANSI_SGR_LINETHROUGH_OFF = 29 + ANSI_SGR_FOREGROUND_BLACK = 30 + ANSI_SGR_FOREGROUND_RED = 31 + ANSI_SGR_FOREGROUND_GREEN = 32 + ANSI_SGR_FOREGROUND_YELLOW = 33 + ANSI_SGR_FOREGROUND_BLUE = 34 + ANSI_SGR_FOREGROUND_MAGENTA = 35 + ANSI_SGR_FOREGROUND_CYAN = 36 + ANSI_SGR_FOREGROUND_WHITE = 37 + _ANSI_SGR_RESERVED_01 = 38 + ANSI_SGR_FOREGROUND_DEFAULT = 39 + ANSI_SGR_BACKGROUND_BLACK = 40 + ANSI_SGR_BACKGROUND_RED = 41 + ANSI_SGR_BACKGROUND_GREEN = 42 + ANSI_SGR_BACKGROUND_YELLOW = 43 + ANSI_SGR_BACKGROUND_BLUE = 44 + ANSI_SGR_BACKGROUND_MAGENTA = 45 + ANSI_SGR_BACKGROUND_CYAN = 46 + ANSI_SGR_BACKGROUND_WHITE = 47 + _ANSI_SGR_RESERVED_02 = 48 + ANSI_SGR_BACKGROUND_DEFAULT = 49 + // 50 - 65: Unsupported + + ANSI_MAX_CMD_LENGTH = 4096 + + MAX_INPUT_EVENTS = 128 + DEFAULT_WIDTH = 80 + DEFAULT_HEIGHT = 24 + + ANSI_BEL = 0x07 + ANSI_BACKSPACE = 0x08 + ANSI_TAB = 0x09 + ANSI_LINE_FEED = 0x0A + ANSI_VERTICAL_TAB = 0x0B + ANSI_FORM_FEED = 0x0C + ANSI_CARRIAGE_RETURN = 0x0D + ANSI_ESCAPE_PRIMARY = 0x1B + ANSI_ESCAPE_SECONDARY = 0x5B + ANSI_OSC_STRING_ENTRY = 0x5D + ANSI_COMMAND_FIRST = 0x40 + ANSI_COMMAND_LAST = 0x7E + DCS_ENTRY = 0x90 + CSI_ENTRY = 0x9B + OSC_STRING = 0x9D + ANSI_PARAMETER_SEP = ";" + ANSI_CMD_G0 = '(' + ANSI_CMD_G1 = ')' + ANSI_CMD_G2 = '*' + ANSI_CMD_G3 = '+' + ANSI_CMD_DECPNM = '>' + ANSI_CMD_DECPAM = '=' + ANSI_CMD_OSC = ']' + ANSI_CMD_STR_TERM = '\\' + + KEY_CONTROL_PARAM_2 = ";2" + KEY_CONTROL_PARAM_3 = ";3" + KEY_CONTROL_PARAM_4 = ";4" + KEY_CONTROL_PARAM_5 = ";5" + KEY_CONTROL_PARAM_6 = ";6" + KEY_CONTROL_PARAM_7 = ";7" + KEY_CONTROL_PARAM_8 = ";8" + KEY_ESC_CSI = "\x1B[" + KEY_ESC_N = "\x1BN" + KEY_ESC_O = "\x1BO" + + FILL_CHARACTER = ' ' +) + +func getByteRange(start byte, end byte) []byte { + bytes := make([]byte, 0, 32) + for i := start; i <= end; i++ { + bytes = append(bytes, byte(i)) + } + + return bytes +} + +var toGroundBytes = getToGroundBytes() +var executors = getExecuteBytes() + +// SPACE 20+A0 hex Always and everywhere a blank space +// Intermediate 20-2F hex !"#$%&'()*+,-./ +var intermeds = getByteRange(0x20, 0x2F) + +// Parameters 30-3F hex 0123456789:;<=>? +// CSI Parameters 30-39, 3B hex 0123456789; +var csiParams = getByteRange(0x30, 0x3F) + +var csiCollectables = append(getByteRange(0x30, 0x39), getByteRange(0x3B, 0x3F)...) + +// Uppercase 40-5F hex @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +var upperCase = getByteRange(0x40, 0x5F) + +// Lowercase 60-7E hex `abcdefghijlkmnopqrstuvwxyz{|}~ +var lowerCase = getByteRange(0x60, 0x7E) + +// Alphabetics 40-7E hex (all of upper and lower case) +var alphabetics = append(upperCase, lowerCase...) + +var printables = getByteRange(0x20, 0x7F) + +var escapeIntermediateToGroundBytes = getByteRange(0x30, 0x7E) +var escapeToGroundBytes = getEscapeToGroundBytes() + +// See http://www.vt100.net/emu/vt500_parser.png for description of the complex +// byte ranges below + +func getEscapeToGroundBytes() []byte { + escapeToGroundBytes := getByteRange(0x30, 0x4F) + escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x51, 0x57)...) + escapeToGroundBytes = append(escapeToGroundBytes, 0x59) + escapeToGroundBytes = append(escapeToGroundBytes, 0x5A) + escapeToGroundBytes = append(escapeToGroundBytes, 0x5C) + escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x60, 0x7E)...) + return escapeToGroundBytes +} + +func getExecuteBytes() []byte { + executeBytes := getByteRange(0x00, 0x17) + executeBytes = append(executeBytes, 0x19) + executeBytes = append(executeBytes, getByteRange(0x1C, 0x1F)...) + return executeBytes +} + +func getToGroundBytes() []byte { + groundBytes := []byte{0x18} + groundBytes = append(groundBytes, 0x1A) + groundBytes = append(groundBytes, getByteRange(0x80, 0x8F)...) + groundBytes = append(groundBytes, getByteRange(0x91, 0x97)...) + groundBytes = append(groundBytes, 0x99) + groundBytes = append(groundBytes, 0x9A) + groundBytes = append(groundBytes, 0x9C) + return groundBytes +} + +// Delete 7F hex Always and everywhere ignored +// C1 Control 80-9F hex 32 additional control characters +// G1 Displayable A1-FE hex 94 additional displayable characters +// Special A0+FF hex Same as SPACE and DELETE diff --git a/vendor/github.com/Azure/go-ansiterm/context.go b/vendor/github.com/Azure/go-ansiterm/context.go new file mode 100644 index 00000000..8d66e777 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/context.go @@ -0,0 +1,7 @@ +package ansiterm + +type ansiContext struct { + currentChar byte + paramBuffer []byte + interBuffer []byte +} diff --git a/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go b/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go new file mode 100644 index 00000000..bcbe00d0 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go @@ -0,0 +1,49 @@ +package ansiterm + +type csiEntryState struct { + baseState +} + +func (csiState csiEntryState) Handle(b byte) (s state, e error) { + csiState.parser.logf("CsiEntry::Handle %#x", b) + + nextState, err := csiState.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case sliceContains(alphabetics, b): + return csiState.parser.ground, nil + case sliceContains(csiCollectables, b): + return csiState.parser.csiParam, nil + case sliceContains(executors, b): + return csiState, csiState.parser.execute() + } + + return csiState, nil +} + +func (csiState csiEntryState) Transition(s state) error { + csiState.parser.logf("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name()) + csiState.baseState.Transition(s) + + switch s { + case csiState.parser.ground: + return csiState.parser.csiDispatch() + case csiState.parser.csiParam: + switch { + case sliceContains(csiParams, csiState.parser.context.currentChar): + csiState.parser.collectParam() + case sliceContains(intermeds, csiState.parser.context.currentChar): + csiState.parser.collectInter() + } + } + + return nil +} + +func (csiState csiEntryState) Enter() error { + csiState.parser.clear() + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/csi_param_state.go b/vendor/github.com/Azure/go-ansiterm/csi_param_state.go new file mode 100644 index 00000000..7ed5e01c --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/csi_param_state.go @@ -0,0 +1,38 @@ +package ansiterm + +type csiParamState struct { + baseState +} + +func (csiState csiParamState) Handle(b byte) (s state, e error) { + csiState.parser.logf("CsiParam::Handle %#x", b) + + nextState, err := csiState.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case sliceContains(alphabetics, b): + return csiState.parser.ground, nil + case sliceContains(csiCollectables, b): + csiState.parser.collectParam() + return csiState, nil + case sliceContains(executors, b): + return csiState, csiState.parser.execute() + } + + return csiState, nil +} + +func (csiState csiParamState) Transition(s state) error { + csiState.parser.logf("CsiParam::Transition %s --> %s", csiState.Name(), s.Name()) + csiState.baseState.Transition(s) + + switch s { + case csiState.parser.ground: + return csiState.parser.csiDispatch() + } + + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go b/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go new file mode 100644 index 00000000..1c719db9 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go @@ -0,0 +1,36 @@ +package ansiterm + +type escapeIntermediateState struct { + baseState +} + +func (escState escapeIntermediateState) Handle(b byte) (s state, e error) { + escState.parser.logf("escapeIntermediateState::Handle %#x", b) + nextState, err := escState.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case sliceContains(intermeds, b): + return escState, escState.parser.collectInter() + case sliceContains(executors, b): + return escState, escState.parser.execute() + case sliceContains(escapeIntermediateToGroundBytes, b): + return escState.parser.ground, nil + } + + return escState, nil +} + +func (escState escapeIntermediateState) Transition(s state) error { + escState.parser.logf("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name()) + escState.baseState.Transition(s) + + switch s { + case escState.parser.ground: + return escState.parser.escDispatch() + } + + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/escape_state.go b/vendor/github.com/Azure/go-ansiterm/escape_state.go new file mode 100644 index 00000000..6390abd2 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/escape_state.go @@ -0,0 +1,47 @@ +package ansiterm + +type escapeState struct { + baseState +} + +func (escState escapeState) Handle(b byte) (s state, e error) { + escState.parser.logf("escapeState::Handle %#x", b) + nextState, err := escState.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case b == ANSI_ESCAPE_SECONDARY: + return escState.parser.csiEntry, nil + case b == ANSI_OSC_STRING_ENTRY: + return escState.parser.oscString, nil + case sliceContains(executors, b): + return escState, escState.parser.execute() + case sliceContains(escapeToGroundBytes, b): + return escState.parser.ground, nil + case sliceContains(intermeds, b): + return escState.parser.escapeIntermediate, nil + } + + return escState, nil +} + +func (escState escapeState) Transition(s state) error { + escState.parser.logf("Escape::Transition %s --> %s", escState.Name(), s.Name()) + escState.baseState.Transition(s) + + switch s { + case escState.parser.ground: + return escState.parser.escDispatch() + case escState.parser.escapeIntermediate: + return escState.parser.collectInter() + } + + return nil +} + +func (escState escapeState) Enter() error { + escState.parser.clear() + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/event_handler.go b/vendor/github.com/Azure/go-ansiterm/event_handler.go new file mode 100644 index 00000000..98087b38 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/event_handler.go @@ -0,0 +1,90 @@ +package ansiterm + +type AnsiEventHandler interface { + // Print + Print(b byte) error + + // Execute C0 commands + Execute(b byte) error + + // CUrsor Up + CUU(int) error + + // CUrsor Down + CUD(int) error + + // CUrsor Forward + CUF(int) error + + // CUrsor Backward + CUB(int) error + + // Cursor to Next Line + CNL(int) error + + // Cursor to Previous Line + CPL(int) error + + // Cursor Horizontal position Absolute + CHA(int) error + + // Vertical line Position Absolute + VPA(int) error + + // CUrsor Position + CUP(int, int) error + + // Horizontal and Vertical Position (depends on PUM) + HVP(int, int) error + + // Text Cursor Enable Mode + DECTCEM(bool) error + + // Origin Mode + DECOM(bool) error + + // 132 Column Mode + DECCOLM(bool) error + + // Erase in Display + ED(int) error + + // Erase in Line + EL(int) error + + // Insert Line + IL(int) error + + // Delete Line + DL(int) error + + // Insert Character + ICH(int) error + + // Delete Character + DCH(int) error + + // Set Graphics Rendition + SGR([]int) error + + // Pan Down + SU(int) error + + // Pan Up + SD(int) error + + // Device Attributes + DA([]string) error + + // Set Top and Bottom Margins + DECSTBM(int, int) error + + // Index + IND() error + + // Reverse Index + RI() error + + // Flush updates from previous commands + Flush() error +} diff --git a/vendor/github.com/Azure/go-ansiterm/ground_state.go b/vendor/github.com/Azure/go-ansiterm/ground_state.go new file mode 100644 index 00000000..52451e94 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/ground_state.go @@ -0,0 +1,24 @@ +package ansiterm + +type groundState struct { + baseState +} + +func (gs groundState) Handle(b byte) (s state, e error) { + gs.parser.context.currentChar = b + + nextState, err := gs.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case sliceContains(printables, b): + return gs, gs.parser.print() + + case sliceContains(executors, b): + return gs, gs.parser.execute() + } + + return gs, nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/osc_string_state.go b/vendor/github.com/Azure/go-ansiterm/osc_string_state.go new file mode 100644 index 00000000..593b10ab --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/osc_string_state.go @@ -0,0 +1,31 @@ +package ansiterm + +type oscStringState struct { + baseState +} + +func (oscState oscStringState) Handle(b byte) (s state, e error) { + oscState.parser.logf("OscString::Handle %#x", b) + nextState, err := oscState.baseState.Handle(b) + if nextState != nil || err != nil { + return nextState, err + } + + switch { + case isOscStringTerminator(b): + return oscState.parser.ground, nil + } + + return oscState, nil +} + +// See below for OSC string terminators for linux +// http://man7.org/linux/man-pages/man4/console_codes.4.html +func isOscStringTerminator(b byte) bool { + + if b == ANSI_BEL || b == 0x5C { + return true + } + + return false +} diff --git a/vendor/github.com/Azure/go-ansiterm/parser.go b/vendor/github.com/Azure/go-ansiterm/parser.go new file mode 100644 index 00000000..03cec7ad --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/parser.go @@ -0,0 +1,151 @@ +package ansiterm + +import ( + "errors" + "log" + "os" +) + +type AnsiParser struct { + currState state + eventHandler AnsiEventHandler + context *ansiContext + csiEntry state + csiParam state + dcsEntry state + escape state + escapeIntermediate state + error state + ground state + oscString state + stateMap []state + + logf func(string, ...interface{}) +} + +type Option func(*AnsiParser) + +func WithLogf(f func(string, ...interface{})) Option { + return func(ap *AnsiParser) { + ap.logf = f + } +} + +func CreateParser(initialState string, evtHandler AnsiEventHandler, opts ...Option) *AnsiParser { + ap := &AnsiParser{ + eventHandler: evtHandler, + context: &ansiContext{}, + } + for _, o := range opts { + o(ap) + } + + if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" { + logFile, _ := os.Create("ansiParser.log") + logger := log.New(logFile, "", log.LstdFlags) + if ap.logf != nil { + l := ap.logf + ap.logf = func(s string, v ...interface{}) { + l(s, v...) + logger.Printf(s, v...) + } + } else { + ap.logf = logger.Printf + } + } + + if ap.logf == nil { + ap.logf = func(string, ...interface{}) {} + } + + ap.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: ap}} + ap.csiParam = csiParamState{baseState{name: "CsiParam", parser: ap}} + ap.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: ap}} + ap.escape = escapeState{baseState{name: "Escape", parser: ap}} + ap.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: ap}} + ap.error = errorState{baseState{name: "Error", parser: ap}} + ap.ground = groundState{baseState{name: "Ground", parser: ap}} + ap.oscString = oscStringState{baseState{name: "OscString", parser: ap}} + + ap.stateMap = []state{ + ap.csiEntry, + ap.csiParam, + ap.dcsEntry, + ap.escape, + ap.escapeIntermediate, + ap.error, + ap.ground, + ap.oscString, + } + + ap.currState = getState(initialState, ap.stateMap) + + ap.logf("CreateParser: parser %p", ap) + return ap +} + +func getState(name string, states []state) state { + for _, el := range states { + if el.Name() == name { + return el + } + } + + return nil +} + +func (ap *AnsiParser) Parse(bytes []byte) (int, error) { + for i, b := range bytes { + if err := ap.handle(b); err != nil { + return i, err + } + } + + return len(bytes), ap.eventHandler.Flush() +} + +func (ap *AnsiParser) handle(b byte) error { + ap.context.currentChar = b + newState, err := ap.currState.Handle(b) + if err != nil { + return err + } + + if newState == nil { + ap.logf("WARNING: newState is nil") + return errors.New("New state of 'nil' is invalid.") + } + + if newState != ap.currState { + if err := ap.changeState(newState); err != nil { + return err + } + } + + return nil +} + +func (ap *AnsiParser) changeState(newState state) error { + ap.logf("ChangeState %s --> %s", ap.currState.Name(), newState.Name()) + + // Exit old state + if err := ap.currState.Exit(); err != nil { + ap.logf("Exit state '%s' failed with : '%v'", ap.currState.Name(), err) + return err + } + + // Perform transition action + if err := ap.currState.Transition(newState); err != nil { + ap.logf("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err) + return err + } + + // Enter new state + if err := newState.Enter(); err != nil { + ap.logf("Enter state '%s' failed with: '%v'", newState.Name(), err) + return err + } + + ap.currState = newState + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go b/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go new file mode 100644 index 00000000..de0a1f9c --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go @@ -0,0 +1,99 @@ +package ansiterm + +import ( + "strconv" +) + +func parseParams(bytes []byte) ([]string, error) { + paramBuff := make([]byte, 0, 0) + params := []string{} + + for _, v := range bytes { + if v == ';' { + if len(paramBuff) > 0 { + // Completed parameter, append it to the list + s := string(paramBuff) + params = append(params, s) + paramBuff = make([]byte, 0, 0) + } + } else { + paramBuff = append(paramBuff, v) + } + } + + // Last parameter may not be terminated with ';' + if len(paramBuff) > 0 { + s := string(paramBuff) + params = append(params, s) + } + + return params, nil +} + +func parseCmd(context ansiContext) (string, error) { + return string(context.currentChar), nil +} + +func getInt(params []string, dflt int) int { + i := getInts(params, 1, dflt)[0] + return i +} + +func getInts(params []string, minCount int, dflt int) []int { + ints := []int{} + + for _, v := range params { + i, _ := strconv.Atoi(v) + // Zero is mapped to the default value in VT100. + if i == 0 { + i = dflt + } + ints = append(ints, i) + } + + if len(ints) < minCount { + remaining := minCount - len(ints) + for i := 0; i < remaining; i++ { + ints = append(ints, dflt) + } + } + + return ints +} + +func (ap *AnsiParser) modeDispatch(param string, set bool) error { + switch param { + case "?3": + return ap.eventHandler.DECCOLM(set) + case "?6": + return ap.eventHandler.DECOM(set) + case "?25": + return ap.eventHandler.DECTCEM(set) + } + return nil +} + +func (ap *AnsiParser) hDispatch(params []string) error { + if len(params) == 1 { + return ap.modeDispatch(params[0], true) + } + + return nil +} + +func (ap *AnsiParser) lDispatch(params []string) error { + if len(params) == 1 { + return ap.modeDispatch(params[0], false) + } + + return nil +} + +func getEraseParam(params []string) int { + param := getInt(params, 0) + if param < 0 || 3 < param { + param = 0 + } + + return param +} diff --git a/vendor/github.com/Azure/go-ansiterm/parser_actions.go b/vendor/github.com/Azure/go-ansiterm/parser_actions.go new file mode 100644 index 00000000..0bb5e51e --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/parser_actions.go @@ -0,0 +1,119 @@ +package ansiterm + +func (ap *AnsiParser) collectParam() error { + currChar := ap.context.currentChar + ap.logf("collectParam %#x", currChar) + ap.context.paramBuffer = append(ap.context.paramBuffer, currChar) + return nil +} + +func (ap *AnsiParser) collectInter() error { + currChar := ap.context.currentChar + ap.logf("collectInter %#x", currChar) + ap.context.paramBuffer = append(ap.context.interBuffer, currChar) + return nil +} + +func (ap *AnsiParser) escDispatch() error { + cmd, _ := parseCmd(*ap.context) + intermeds := ap.context.interBuffer + ap.logf("escDispatch currentChar: %#x", ap.context.currentChar) + ap.logf("escDispatch: %v(%v)", cmd, intermeds) + + switch cmd { + case "D": // IND + return ap.eventHandler.IND() + case "E": // NEL, equivalent to CRLF + err := ap.eventHandler.Execute(ANSI_CARRIAGE_RETURN) + if err == nil { + err = ap.eventHandler.Execute(ANSI_LINE_FEED) + } + return err + case "M": // RI + return ap.eventHandler.RI() + } + + return nil +} + +func (ap *AnsiParser) csiDispatch() error { + cmd, _ := parseCmd(*ap.context) + params, _ := parseParams(ap.context.paramBuffer) + ap.logf("Parsed params: %v with length: %d", params, len(params)) + + ap.logf("csiDispatch: %v(%v)", cmd, params) + + switch cmd { + case "@": + return ap.eventHandler.ICH(getInt(params, 1)) + case "A": + return ap.eventHandler.CUU(getInt(params, 1)) + case "B": + return ap.eventHandler.CUD(getInt(params, 1)) + case "C": + return ap.eventHandler.CUF(getInt(params, 1)) + case "D": + return ap.eventHandler.CUB(getInt(params, 1)) + case "E": + return ap.eventHandler.CNL(getInt(params, 1)) + case "F": + return ap.eventHandler.CPL(getInt(params, 1)) + case "G": + return ap.eventHandler.CHA(getInt(params, 1)) + case "H": + ints := getInts(params, 2, 1) + x, y := ints[0], ints[1] + return ap.eventHandler.CUP(x, y) + case "J": + param := getEraseParam(params) + return ap.eventHandler.ED(param) + case "K": + param := getEraseParam(params) + return ap.eventHandler.EL(param) + case "L": + return ap.eventHandler.IL(getInt(params, 1)) + case "M": + return ap.eventHandler.DL(getInt(params, 1)) + case "P": + return ap.eventHandler.DCH(getInt(params, 1)) + case "S": + return ap.eventHandler.SU(getInt(params, 1)) + case "T": + return ap.eventHandler.SD(getInt(params, 1)) + case "c": + return ap.eventHandler.DA(params) + case "d": + return ap.eventHandler.VPA(getInt(params, 1)) + case "f": + ints := getInts(params, 2, 1) + x, y := ints[0], ints[1] + return ap.eventHandler.HVP(x, y) + case "h": + return ap.hDispatch(params) + case "l": + return ap.lDispatch(params) + case "m": + return ap.eventHandler.SGR(getInts(params, 1, 0)) + case "r": + ints := getInts(params, 2, 1) + top, bottom := ints[0], ints[1] + return ap.eventHandler.DECSTBM(top, bottom) + default: + ap.logf("ERROR: Unsupported CSI command: '%s', with full context: %v", cmd, ap.context) + return nil + } + +} + +func (ap *AnsiParser) print() error { + return ap.eventHandler.Print(ap.context.currentChar) +} + +func (ap *AnsiParser) clear() error { + ap.context = &ansiContext{} + return nil +} + +func (ap *AnsiParser) execute() error { + return ap.eventHandler.Execute(ap.context.currentChar) +} diff --git a/vendor/github.com/Azure/go-ansiterm/states.go b/vendor/github.com/Azure/go-ansiterm/states.go new file mode 100644 index 00000000..f2ea1fcd --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/states.go @@ -0,0 +1,71 @@ +package ansiterm + +type stateID int + +type state interface { + Enter() error + Exit() error + Handle(byte) (state, error) + Name() string + Transition(state) error +} + +type baseState struct { + name string + parser *AnsiParser +} + +func (base baseState) Enter() error { + return nil +} + +func (base baseState) Exit() error { + return nil +} + +func (base baseState) Handle(b byte) (s state, e error) { + + switch { + case b == CSI_ENTRY: + return base.parser.csiEntry, nil + case b == DCS_ENTRY: + return base.parser.dcsEntry, nil + case b == ANSI_ESCAPE_PRIMARY: + return base.parser.escape, nil + case b == OSC_STRING: + return base.parser.oscString, nil + case sliceContains(toGroundBytes, b): + return base.parser.ground, nil + } + + return nil, nil +} + +func (base baseState) Name() string { + return base.name +} + +func (base baseState) Transition(s state) error { + if s == base.parser.ground { + execBytes := []byte{0x18} + execBytes = append(execBytes, 0x1A) + execBytes = append(execBytes, getByteRange(0x80, 0x8F)...) + execBytes = append(execBytes, getByteRange(0x91, 0x97)...) + execBytes = append(execBytes, 0x99) + execBytes = append(execBytes, 0x9A) + + if sliceContains(execBytes, base.parser.context.currentChar) { + return base.parser.execute() + } + } + + return nil +} + +type dcsEntryState struct { + baseState +} + +type errorState struct { + baseState +} diff --git a/vendor/github.com/Azure/go-ansiterm/utilities.go b/vendor/github.com/Azure/go-ansiterm/utilities.go new file mode 100644 index 00000000..39211449 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/utilities.go @@ -0,0 +1,21 @@ +package ansiterm + +import ( + "strconv" +) + +func sliceContains(bytes []byte, b byte) bool { + for _, v := range bytes { + if v == b { + return true + } + } + + return false +} + +func convertBytesToInteger(bytes []byte) int { + s := string(bytes) + i, _ := strconv.Atoi(s) + return i +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go new file mode 100644 index 00000000..5599082a --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go @@ -0,0 +1,196 @@ +// +build windows + +package winterm + +import ( + "fmt" + "os" + "strconv" + "strings" + "syscall" + + "github.com/Azure/go-ansiterm" + windows "golang.org/x/sys/windows" +) + +// Windows keyboard constants +// See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx. +const ( + VK_PRIOR = 0x21 // PAGE UP key + VK_NEXT = 0x22 // PAGE DOWN key + VK_END = 0x23 // END key + VK_HOME = 0x24 // HOME key + VK_LEFT = 0x25 // LEFT ARROW key + VK_UP = 0x26 // UP ARROW key + VK_RIGHT = 0x27 // RIGHT ARROW key + VK_DOWN = 0x28 // DOWN ARROW key + VK_SELECT = 0x29 // SELECT key + VK_PRINT = 0x2A // PRINT key + VK_EXECUTE = 0x2B // EXECUTE key + VK_SNAPSHOT = 0x2C // PRINT SCREEN key + VK_INSERT = 0x2D // INS key + VK_DELETE = 0x2E // DEL key + VK_HELP = 0x2F // HELP key + VK_F1 = 0x70 // F1 key + VK_F2 = 0x71 // F2 key + VK_F3 = 0x72 // F3 key + VK_F4 = 0x73 // F4 key + VK_F5 = 0x74 // F5 key + VK_F6 = 0x75 // F6 key + VK_F7 = 0x76 // F7 key + VK_F8 = 0x77 // F8 key + VK_F9 = 0x78 // F9 key + VK_F10 = 0x79 // F10 key + VK_F11 = 0x7A // F11 key + VK_F12 = 0x7B // F12 key + + RIGHT_ALT_PRESSED = 0x0001 + LEFT_ALT_PRESSED = 0x0002 + RIGHT_CTRL_PRESSED = 0x0004 + LEFT_CTRL_PRESSED = 0x0008 + SHIFT_PRESSED = 0x0010 + NUMLOCK_ON = 0x0020 + SCROLLLOCK_ON = 0x0040 + CAPSLOCK_ON = 0x0080 + ENHANCED_KEY = 0x0100 +) + +type ansiCommand struct { + CommandBytes []byte + Command string + Parameters []string + IsSpecial bool +} + +func newAnsiCommand(command []byte) *ansiCommand { + + if isCharacterSelectionCmdChar(command[1]) { + // Is Character Set Selection commands + return &ansiCommand{ + CommandBytes: command, + Command: string(command), + IsSpecial: true, + } + } + + // last char is command character + lastCharIndex := len(command) - 1 + + ac := &ansiCommand{ + CommandBytes: command, + Command: string(command[lastCharIndex]), + IsSpecial: false, + } + + // more than a single escape + if lastCharIndex != 0 { + start := 1 + // skip if double char escape sequence + if command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_ESCAPE_SECONDARY { + start++ + } + // convert this to GetNextParam method + ac.Parameters = strings.Split(string(command[start:lastCharIndex]), ansiterm.ANSI_PARAMETER_SEP) + } + + return ac +} + +func (ac *ansiCommand) paramAsSHORT(index int, defaultValue int16) int16 { + if index < 0 || index >= len(ac.Parameters) { + return defaultValue + } + + param, err := strconv.ParseInt(ac.Parameters[index], 10, 16) + if err != nil { + return defaultValue + } + + return int16(param) +} + +func (ac *ansiCommand) String() string { + return fmt.Sprintf("0x%v \"%v\" (\"%v\")", + bytesToHex(ac.CommandBytes), + ac.Command, + strings.Join(ac.Parameters, "\",\"")) +} + +// isAnsiCommandChar returns true if the passed byte falls within the range of ANSI commands. +// See http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html. +func isAnsiCommandChar(b byte) bool { + switch { + case ansiterm.ANSI_COMMAND_FIRST <= b && b <= ansiterm.ANSI_COMMAND_LAST && b != ansiterm.ANSI_ESCAPE_SECONDARY: + return true + case b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_OSC || b == ansiterm.ANSI_CMD_DECPAM || b == ansiterm.ANSI_CMD_DECPNM: + // non-CSI escape sequence terminator + return true + case b == ansiterm.ANSI_CMD_STR_TERM || b == ansiterm.ANSI_BEL: + // String escape sequence terminator + return true + } + return false +} + +func isXtermOscSequence(command []byte, current byte) bool { + return (len(command) >= 2 && command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_CMD_OSC && current != ansiterm.ANSI_BEL) +} + +func isCharacterSelectionCmdChar(b byte) bool { + return (b == ansiterm.ANSI_CMD_G0 || b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_G2 || b == ansiterm.ANSI_CMD_G3) +} + +// bytesToHex converts a slice of bytes to a human-readable string. +func bytesToHex(b []byte) string { + hex := make([]string, len(b)) + for i, ch := range b { + hex[i] = fmt.Sprintf("%X", ch) + } + return strings.Join(hex, "") +} + +// ensureInRange adjusts the passed value, if necessary, to ensure it is within +// the passed min / max range. +func ensureInRange(n int16, min int16, max int16) int16 { + if n < min { + return min + } else if n > max { + return max + } else { + return n + } +} + +func GetStdFile(nFile int) (*os.File, uintptr) { + var file *os.File + + // syscall uses negative numbers + // windows package uses very big uint32 + // Keep these switches split so we don't have to convert ints too much. + switch uint32(nFile) { + case windows.STD_INPUT_HANDLE: + file = os.Stdin + case windows.STD_OUTPUT_HANDLE: + file = os.Stdout + case windows.STD_ERROR_HANDLE: + file = os.Stderr + default: + switch nFile { + case syscall.STD_INPUT_HANDLE: + file = os.Stdin + case syscall.STD_OUTPUT_HANDLE: + file = os.Stdout + case syscall.STD_ERROR_HANDLE: + file = os.Stderr + default: + panic(fmt.Errorf("Invalid standard handle identifier: %v", nFile)) + } + } + + fd, err := syscall.GetStdHandle(nFile) + if err != nil { + panic(fmt.Errorf("Invalid standard handle identifier: %v -- %v", nFile, err)) + } + + return file, uintptr(fd) +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/api.go b/vendor/github.com/Azure/go-ansiterm/winterm/api.go new file mode 100644 index 00000000..6055e33b --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/api.go @@ -0,0 +1,327 @@ +// +build windows + +package winterm + +import ( + "fmt" + "syscall" + "unsafe" +) + +//=========================================================================================================== +// IMPORTANT NOTE: +// +// The methods below make extensive use of the "unsafe" package to obtain the required pointers. +// Beginning in Go 1.3, the garbage collector may release local variables (e.g., incoming arguments, stack +// variables) the pointers reference *before* the API completes. +// +// As a result, in those cases, the code must hint that the variables remain in active by invoking the +// dummy method "use" (see below). Newer versions of Go are planned to change the mechanism to no longer +// require unsafe pointers. +// +// If you add or modify methods, ENSURE protection of local variables through the "use" builtin to inform +// the garbage collector the variables remain in use if: +// +// -- The value is not a pointer (e.g., int32, struct) +// -- The value is not referenced by the method after passing the pointer to Windows +// +// See http://golang.org/doc/go1.3. +//=========================================================================================================== + +var ( + kernel32DLL = syscall.NewLazyDLL("kernel32.dll") + + getConsoleCursorInfoProc = kernel32DLL.NewProc("GetConsoleCursorInfo") + setConsoleCursorInfoProc = kernel32DLL.NewProc("SetConsoleCursorInfo") + setConsoleCursorPositionProc = kernel32DLL.NewProc("SetConsoleCursorPosition") + setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode") + getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo") + setConsoleScreenBufferSizeProc = kernel32DLL.NewProc("SetConsoleScreenBufferSize") + scrollConsoleScreenBufferProc = kernel32DLL.NewProc("ScrollConsoleScreenBufferA") + setConsoleTextAttributeProc = kernel32DLL.NewProc("SetConsoleTextAttribute") + setConsoleWindowInfoProc = kernel32DLL.NewProc("SetConsoleWindowInfo") + writeConsoleOutputProc = kernel32DLL.NewProc("WriteConsoleOutputW") + readConsoleInputProc = kernel32DLL.NewProc("ReadConsoleInputW") + waitForSingleObjectProc = kernel32DLL.NewProc("WaitForSingleObject") +) + +// Windows Console constants +const ( + // Console modes + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx. + ENABLE_PROCESSED_INPUT = 0x0001 + ENABLE_LINE_INPUT = 0x0002 + ENABLE_ECHO_INPUT = 0x0004 + ENABLE_WINDOW_INPUT = 0x0008 + ENABLE_MOUSE_INPUT = 0x0010 + ENABLE_INSERT_MODE = 0x0020 + ENABLE_QUICK_EDIT_MODE = 0x0040 + ENABLE_EXTENDED_FLAGS = 0x0080 + ENABLE_AUTO_POSITION = 0x0100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200 + + ENABLE_PROCESSED_OUTPUT = 0x0001 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + DISABLE_NEWLINE_AUTO_RETURN = 0x0008 + ENABLE_LVB_GRID_WORLDWIDE = 0x0010 + + // Character attributes + // Note: + // -- The attributes are combined to produce various colors (e.g., Blue + Green will create Cyan). + // Clearing all foreground or background colors results in black; setting all creates white. + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes. + FOREGROUND_BLUE uint16 = 0x0001 + FOREGROUND_GREEN uint16 = 0x0002 + FOREGROUND_RED uint16 = 0x0004 + FOREGROUND_INTENSITY uint16 = 0x0008 + FOREGROUND_MASK uint16 = 0x000F + + BACKGROUND_BLUE uint16 = 0x0010 + BACKGROUND_GREEN uint16 = 0x0020 + BACKGROUND_RED uint16 = 0x0040 + BACKGROUND_INTENSITY uint16 = 0x0080 + BACKGROUND_MASK uint16 = 0x00F0 + + COMMON_LVB_MASK uint16 = 0xFF00 + COMMON_LVB_REVERSE_VIDEO uint16 = 0x4000 + COMMON_LVB_UNDERSCORE uint16 = 0x8000 + + // Input event types + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx. + KEY_EVENT = 0x0001 + MOUSE_EVENT = 0x0002 + WINDOW_BUFFER_SIZE_EVENT = 0x0004 + MENU_EVENT = 0x0008 + FOCUS_EVENT = 0x0010 + + // WaitForSingleObject return codes + WAIT_ABANDONED = 0x00000080 + WAIT_FAILED = 0xFFFFFFFF + WAIT_SIGNALED = 0x0000000 + WAIT_TIMEOUT = 0x00000102 + + // WaitForSingleObject wait duration + WAIT_INFINITE = 0xFFFFFFFF + WAIT_ONE_SECOND = 1000 + WAIT_HALF_SECOND = 500 + WAIT_QUARTER_SECOND = 250 +) + +// Windows API Console types +// -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682101(v=vs.85).aspx for Console specific types (e.g., COORD) +// -- See https://msdn.microsoft.com/en-us/library/aa296569(v=vs.60).aspx for comments on alignment +type ( + CHAR_INFO struct { + UnicodeChar uint16 + Attributes uint16 + } + + CONSOLE_CURSOR_INFO struct { + Size uint32 + Visible int32 + } + + CONSOLE_SCREEN_BUFFER_INFO struct { + Size COORD + CursorPosition COORD + Attributes uint16 + Window SMALL_RECT + MaximumWindowSize COORD + } + + COORD struct { + X int16 + Y int16 + } + + SMALL_RECT struct { + Left int16 + Top int16 + Right int16 + Bottom int16 + } + + // INPUT_RECORD is a C/C++ union of which KEY_EVENT_RECORD is one case, it is also the largest + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx. + INPUT_RECORD struct { + EventType uint16 + KeyEvent KEY_EVENT_RECORD + } + + KEY_EVENT_RECORD struct { + KeyDown int32 + RepeatCount uint16 + VirtualKeyCode uint16 + VirtualScanCode uint16 + UnicodeChar uint16 + ControlKeyState uint32 + } + + WINDOW_BUFFER_SIZE struct { + Size COORD + } +) + +// boolToBOOL converts a Go bool into a Windows int32. +func boolToBOOL(f bool) int32 { + if f { + return int32(1) + } else { + return int32(0) + } +} + +// GetConsoleCursorInfo retrieves information about the size and visiblity of the console cursor. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683163(v=vs.85).aspx. +func GetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error { + r1, r2, err := getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) + return checkError(r1, r2, err) +} + +// SetConsoleCursorInfo sets the size and visiblity of the console cursor. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx. +func SetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error { + r1, r2, err := setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) + return checkError(r1, r2, err) +} + +// SetConsoleCursorPosition location of the console cursor. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx. +func SetConsoleCursorPosition(handle uintptr, coord COORD) error { + r1, r2, err := setConsoleCursorPositionProc.Call(handle, coordToPointer(coord)) + use(coord) + return checkError(r1, r2, err) +} + +// GetConsoleMode gets the console mode for given file descriptor +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx. +func GetConsoleMode(handle uintptr) (mode uint32, err error) { + err = syscall.GetConsoleMode(syscall.Handle(handle), &mode) + return mode, err +} + +// SetConsoleMode sets the console mode for given file descriptor +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx. +func SetConsoleMode(handle uintptr, mode uint32) error { + r1, r2, err := setConsoleModeProc.Call(handle, uintptr(mode), 0) + use(mode) + return checkError(r1, r2, err) +} + +// GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer. +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx. +func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) { + info := CONSOLE_SCREEN_BUFFER_INFO{} + err := checkError(getConsoleScreenBufferInfoProc.Call(handle, uintptr(unsafe.Pointer(&info)), 0)) + if err != nil { + return nil, err + } + return &info, nil +} + +func ScrollConsoleScreenBuffer(handle uintptr, scrollRect SMALL_RECT, clipRect SMALL_RECT, destOrigin COORD, char CHAR_INFO) error { + r1, r2, err := scrollConsoleScreenBufferProc.Call(handle, uintptr(unsafe.Pointer(&scrollRect)), uintptr(unsafe.Pointer(&clipRect)), coordToPointer(destOrigin), uintptr(unsafe.Pointer(&char))) + use(scrollRect) + use(clipRect) + use(destOrigin) + use(char) + return checkError(r1, r2, err) +} + +// SetConsoleScreenBufferSize sets the size of the console screen buffer. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686044(v=vs.85).aspx. +func SetConsoleScreenBufferSize(handle uintptr, coord COORD) error { + r1, r2, err := setConsoleScreenBufferSizeProc.Call(handle, coordToPointer(coord)) + use(coord) + return checkError(r1, r2, err) +} + +// SetConsoleTextAttribute sets the attributes of characters written to the +// console screen buffer by the WriteFile or WriteConsole function. +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx. +func SetConsoleTextAttribute(handle uintptr, attribute uint16) error { + r1, r2, err := setConsoleTextAttributeProc.Call(handle, uintptr(attribute), 0) + use(attribute) + return checkError(r1, r2, err) +} + +// SetConsoleWindowInfo sets the size and position of the console screen buffer's window. +// Note that the size and location must be within and no larger than the backing console screen buffer. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686125(v=vs.85).aspx. +func SetConsoleWindowInfo(handle uintptr, isAbsolute bool, rect SMALL_RECT) error { + r1, r2, err := setConsoleWindowInfoProc.Call(handle, uintptr(boolToBOOL(isAbsolute)), uintptr(unsafe.Pointer(&rect))) + use(isAbsolute) + use(rect) + return checkError(r1, r2, err) +} + +// WriteConsoleOutput writes the CHAR_INFOs from the provided buffer to the active console buffer. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687404(v=vs.85).aspx. +func WriteConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) error { + r1, r2, err := writeConsoleOutputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), coordToPointer(bufferSize), coordToPointer(bufferCoord), uintptr(unsafe.Pointer(writeRegion))) + use(buffer) + use(bufferSize) + use(bufferCoord) + return checkError(r1, r2, err) +} + +// ReadConsoleInput reads (and removes) data from the console input buffer. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx. +func ReadConsoleInput(handle uintptr, buffer []INPUT_RECORD, count *uint32) error { + r1, r2, err := readConsoleInputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), uintptr(len(buffer)), uintptr(unsafe.Pointer(count))) + use(buffer) + return checkError(r1, r2, err) +} + +// WaitForSingleObject waits for the passed handle to be signaled. +// It returns true if the handle was signaled; false otherwise. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx. +func WaitForSingleObject(handle uintptr, msWait uint32) (bool, error) { + r1, _, err := waitForSingleObjectProc.Call(handle, uintptr(uint32(msWait))) + switch r1 { + case WAIT_ABANDONED, WAIT_TIMEOUT: + return false, nil + case WAIT_SIGNALED: + return true, nil + } + use(msWait) + return false, err +} + +// String helpers +func (info CONSOLE_SCREEN_BUFFER_INFO) String() string { + return fmt.Sprintf("Size(%v) Cursor(%v) Window(%v) Max(%v)", info.Size, info.CursorPosition, info.Window, info.MaximumWindowSize) +} + +func (coord COORD) String() string { + return fmt.Sprintf("%v,%v", coord.X, coord.Y) +} + +func (rect SMALL_RECT) String() string { + return fmt.Sprintf("(%v,%v),(%v,%v)", rect.Left, rect.Top, rect.Right, rect.Bottom) +} + +// checkError evaluates the results of a Windows API call and returns the error if it failed. +func checkError(r1, r2 uintptr, err error) error { + // Windows APIs return non-zero to indicate success + if r1 != 0 { + return nil + } + + // Return the error if provided, otherwise default to EINVAL + if err != nil { + return err + } + return syscall.EINVAL +} + +// coordToPointer converts a COORD into a uintptr (by fooling the type system). +func coordToPointer(c COORD) uintptr { + // Note: This code assumes the two SHORTs are correctly laid out; the "cast" to uint32 is just to get a pointer to pass. + return uintptr(*((*uint32)(unsafe.Pointer(&c)))) +} + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +func use(p interface{}) {} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go b/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go new file mode 100644 index 00000000..cbec8f72 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go @@ -0,0 +1,100 @@ +// +build windows + +package winterm + +import "github.com/Azure/go-ansiterm" + +const ( + FOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE + BACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE +) + +// collectAnsiIntoWindowsAttributes modifies the passed Windows text mode flags to reflect the +// request represented by the passed ANSI mode. +func collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool, baseMode uint16, ansiMode int16) (uint16, bool) { + switch ansiMode { + + // Mode styles + case ansiterm.ANSI_SGR_BOLD: + windowsMode = windowsMode | FOREGROUND_INTENSITY + + case ansiterm.ANSI_SGR_DIM, ansiterm.ANSI_SGR_BOLD_DIM_OFF: + windowsMode &^= FOREGROUND_INTENSITY + + case ansiterm.ANSI_SGR_UNDERLINE: + windowsMode = windowsMode | COMMON_LVB_UNDERSCORE + + case ansiterm.ANSI_SGR_REVERSE: + inverted = true + + case ansiterm.ANSI_SGR_REVERSE_OFF: + inverted = false + + case ansiterm.ANSI_SGR_UNDERLINE_OFF: + windowsMode &^= COMMON_LVB_UNDERSCORE + + // Foreground colors + case ansiterm.ANSI_SGR_FOREGROUND_DEFAULT: + windowsMode = (windowsMode &^ FOREGROUND_MASK) | (baseMode & FOREGROUND_MASK) + + case ansiterm.ANSI_SGR_FOREGROUND_BLACK: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) + + case ansiterm.ANSI_SGR_FOREGROUND_RED: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED + + case ansiterm.ANSI_SGR_FOREGROUND_GREEN: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN + + case ansiterm.ANSI_SGR_FOREGROUND_YELLOW: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN + + case ansiterm.ANSI_SGR_FOREGROUND_BLUE: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_BLUE + + case ansiterm.ANSI_SGR_FOREGROUND_MAGENTA: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_BLUE + + case ansiterm.ANSI_SGR_FOREGROUND_CYAN: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN | FOREGROUND_BLUE + + case ansiterm.ANSI_SGR_FOREGROUND_WHITE: + windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE + + // Background colors + case ansiterm.ANSI_SGR_BACKGROUND_DEFAULT: + // Black with no intensity + windowsMode = (windowsMode &^ BACKGROUND_MASK) | (baseMode & BACKGROUND_MASK) + + case ansiterm.ANSI_SGR_BACKGROUND_BLACK: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) + + case ansiterm.ANSI_SGR_BACKGROUND_RED: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED + + case ansiterm.ANSI_SGR_BACKGROUND_GREEN: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN + + case ansiterm.ANSI_SGR_BACKGROUND_YELLOW: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN + + case ansiterm.ANSI_SGR_BACKGROUND_BLUE: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_BLUE + + case ansiterm.ANSI_SGR_BACKGROUND_MAGENTA: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_BLUE + + case ansiterm.ANSI_SGR_BACKGROUND_CYAN: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN | BACKGROUND_BLUE + + case ansiterm.ANSI_SGR_BACKGROUND_WHITE: + windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE + } + + return windowsMode, inverted +} + +// invertAttributes inverts the foreground and background colors of a Windows attributes value +func invertAttributes(windowsMode uint16) uint16 { + return (COMMON_LVB_MASK & windowsMode) | ((FOREGROUND_MASK & windowsMode) << 4) | ((BACKGROUND_MASK & windowsMode) >> 4) +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go new file mode 100644 index 00000000..3ee06ea7 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go @@ -0,0 +1,101 @@ +// +build windows + +package winterm + +const ( + horizontal = iota + vertical +) + +func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_BUFFER_INFO) SMALL_RECT { + if h.originMode { + sr := h.effectiveSr(info.Window) + return SMALL_RECT{ + Top: sr.top, + Bottom: sr.bottom, + Left: 0, + Right: info.Size.X - 1, + } + } else { + return SMALL_RECT{ + Top: info.Window.Top, + Bottom: info.Window.Bottom, + Left: 0, + Right: info.Size.X - 1, + } + } +} + +// setCursorPosition sets the cursor to the specified position, bounded to the screen size +func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL_RECT) error { + position.X = ensureInRange(position.X, window.Left, window.Right) + position.Y = ensureInRange(position.Y, window.Top, window.Bottom) + err := SetConsoleCursorPosition(h.fd, position) + if err != nil { + return err + } + h.logf("Cursor position set: (%d, %d)", position.X, position.Y) + return err +} + +func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error { + return h.moveCursor(vertical, param) +} + +func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error { + return h.moveCursor(horizontal, param) +} + +func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + position := info.CursorPosition + switch moveMode { + case horizontal: + position.X += int16(param) + case vertical: + position.Y += int16(param) + } + + if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { + return err + } + + return nil +} + +func (h *windowsAnsiEventHandler) moveCursorLine(param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + position := info.CursorPosition + position.X = 0 + position.Y += int16(param) + + if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { + return err + } + + return nil +} + +func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + position := info.CursorPosition + position.X = int16(param) - 1 + + if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go b/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go new file mode 100644 index 00000000..244b5fa2 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go @@ -0,0 +1,84 @@ +// +build windows + +package winterm + +import "github.com/Azure/go-ansiterm" + +func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoord COORD, toCoord COORD) error { + // Ignore an invalid (negative area) request + if toCoord.Y < fromCoord.Y { + return nil + } + + var err error + + var coordStart = COORD{} + var coordEnd = COORD{} + + xCurrent, yCurrent := fromCoord.X, fromCoord.Y + xEnd, yEnd := toCoord.X, toCoord.Y + + // Clear any partial initial line + if xCurrent > 0 { + coordStart.X, coordStart.Y = xCurrent, yCurrent + coordEnd.X, coordEnd.Y = xEnd, yCurrent + + err = h.clearRect(attributes, coordStart, coordEnd) + if err != nil { + return err + } + + xCurrent = 0 + yCurrent += 1 + } + + // Clear intervening rectangular section + if yCurrent < yEnd { + coordStart.X, coordStart.Y = xCurrent, yCurrent + coordEnd.X, coordEnd.Y = xEnd, yEnd-1 + + err = h.clearRect(attributes, coordStart, coordEnd) + if err != nil { + return err + } + + xCurrent = 0 + yCurrent = yEnd + } + + // Clear remaining partial ending line + coordStart.X, coordStart.Y = xCurrent, yCurrent + coordEnd.X, coordEnd.Y = xEnd, yEnd + + err = h.clearRect(attributes, coordStart, coordEnd) + if err != nil { + return err + } + + return nil +} + +func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord COORD, toCoord COORD) error { + region := SMALL_RECT{Top: fromCoord.Y, Left: fromCoord.X, Bottom: toCoord.Y, Right: toCoord.X} + width := toCoord.X - fromCoord.X + 1 + height := toCoord.Y - fromCoord.Y + 1 + size := uint32(width) * uint32(height) + + if size <= 0 { + return nil + } + + buffer := make([]CHAR_INFO, size) + + char := CHAR_INFO{ansiterm.FILL_CHARACTER, attributes} + for i := 0; i < int(size); i++ { + buffer[i] = char + } + + err := WriteConsoleOutput(h.fd, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, ®ion) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go new file mode 100644 index 00000000..2d27fa1d --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go @@ -0,0 +1,118 @@ +// +build windows + +package winterm + +// effectiveSr gets the current effective scroll region in buffer coordinates +func (h *windowsAnsiEventHandler) effectiveSr(window SMALL_RECT) scrollRegion { + top := addInRange(window.Top, h.sr.top, window.Top, window.Bottom) + bottom := addInRange(window.Top, h.sr.bottom, window.Top, window.Bottom) + if top >= bottom { + top = window.Top + bottom = window.Bottom + } + return scrollRegion{top: top, bottom: bottom} +} + +func (h *windowsAnsiEventHandler) scrollUp(param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + sr := h.effectiveSr(info.Window) + return h.scroll(param, sr, info) +} + +func (h *windowsAnsiEventHandler) scrollDown(param int) error { + return h.scrollUp(-param) +} + +func (h *windowsAnsiEventHandler) deleteLines(param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + start := info.CursorPosition.Y + sr := h.effectiveSr(info.Window) + // Lines cannot be inserted or deleted outside the scrolling region. + if start >= sr.top && start <= sr.bottom { + sr.top = start + return h.scroll(param, sr, info) + } else { + return nil + } +} + +func (h *windowsAnsiEventHandler) insertLines(param int) error { + return h.deleteLines(-param) +} + +// scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates. +func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error { + h.logf("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom) + h.logf("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom) + + // Copy from and clip to the scroll region (full buffer width) + scrollRect := SMALL_RECT{ + Top: sr.top, + Bottom: sr.bottom, + Left: 0, + Right: info.Size.X - 1, + } + + // Origin to which area should be copied + destOrigin := COORD{ + X: 0, + Y: sr.top - int16(param), + } + + char := CHAR_INFO{ + UnicodeChar: ' ', + Attributes: h.attributes, + } + + if err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil { + return err + } + return nil +} + +func (h *windowsAnsiEventHandler) deleteCharacters(param int) error { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + return h.scrollLine(param, info.CursorPosition, info) +} + +func (h *windowsAnsiEventHandler) insertCharacters(param int) error { + return h.deleteCharacters(-param) +} + +// scrollLine scrolls a line horizontally starting at the provided position by a number of columns. +func (h *windowsAnsiEventHandler) scrollLine(columns int, position COORD, info *CONSOLE_SCREEN_BUFFER_INFO) error { + // Copy from and clip to the scroll region (full buffer width) + scrollRect := SMALL_RECT{ + Top: position.Y, + Bottom: position.Y, + Left: position.X, + Right: info.Size.X - 1, + } + + // Origin to which area should be copied + destOrigin := COORD{ + X: position.X - int16(columns), + Y: position.Y, + } + + char := CHAR_INFO{ + UnicodeChar: ' ', + Attributes: h.attributes, + } + + if err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go b/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go new file mode 100644 index 00000000..afa7635d --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/utilities.go @@ -0,0 +1,9 @@ +// +build windows + +package winterm + +// AddInRange increments a value by the passed quantity while ensuring the values +// always remain within the supplied min / max range. +func addInRange(n int16, increment int16, min int16, max int16) int16 { + return ensureInRange(n+increment, min, max) +} diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go new file mode 100644 index 00000000..2d40fb75 --- /dev/null +++ b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go @@ -0,0 +1,743 @@ +// +build windows + +package winterm + +import ( + "bytes" + "log" + "os" + "strconv" + + "github.com/Azure/go-ansiterm" +) + +type windowsAnsiEventHandler struct { + fd uintptr + file *os.File + infoReset *CONSOLE_SCREEN_BUFFER_INFO + sr scrollRegion + buffer bytes.Buffer + attributes uint16 + inverted bool + wrapNext bool + drewMarginByte bool + originMode bool + marginByte byte + curInfo *CONSOLE_SCREEN_BUFFER_INFO + curPos COORD + logf func(string, ...interface{}) +} + +type Option func(*windowsAnsiEventHandler) + +func WithLogf(f func(string, ...interface{})) Option { + return func(w *windowsAnsiEventHandler) { + w.logf = f + } +} + +func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) ansiterm.AnsiEventHandler { + infoReset, err := GetConsoleScreenBufferInfo(fd) + if err != nil { + return nil + } + + h := &windowsAnsiEventHandler{ + fd: fd, + file: file, + infoReset: infoReset, + attributes: infoReset.Attributes, + } + for _, o := range opts { + o(h) + } + + if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { + logFile, _ := os.Create("winEventHandler.log") + logger := log.New(logFile, "", log.LstdFlags) + if h.logf != nil { + l := h.logf + h.logf = func(s string, v ...interface{}) { + l(s, v...) + logger.Printf(s, v...) + } + } else { + h.logf = logger.Printf + } + } + + if h.logf == nil { + h.logf = func(string, ...interface{}) {} + } + + return h +} + +type scrollRegion struct { + top int16 + bottom int16 +} + +// simulateLF simulates a LF or CR+LF by scrolling if necessary to handle the +// current cursor position and scroll region settings, in which case it returns +// true. If no special handling is necessary, then it does nothing and returns +// false. +// +// In the false case, the caller should ensure that a carriage return +// and line feed are inserted or that the text is otherwise wrapped. +func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) { + if h.wrapNext { + if err := h.Flush(); err != nil { + return false, err + } + h.clearWrap() + } + pos, info, err := h.getCurrentInfo() + if err != nil { + return false, err + } + sr := h.effectiveSr(info.Window) + if pos.Y == sr.bottom { + // Scrolling is necessary. Let Windows automatically scroll if the scrolling region + // is the full window. + if sr.top == info.Window.Top && sr.bottom == info.Window.Bottom { + if includeCR { + pos.X = 0 + h.updatePos(pos) + } + return false, nil + } + + // A custom scroll region is active. Scroll the window manually to simulate + // the LF. + if err := h.Flush(); err != nil { + return false, err + } + h.logf("Simulating LF inside scroll region") + if err := h.scrollUp(1); err != nil { + return false, err + } + if includeCR { + pos.X = 0 + if err := SetConsoleCursorPosition(h.fd, pos); err != nil { + return false, err + } + } + return true, nil + + } else if pos.Y < info.Window.Bottom { + // Let Windows handle the LF. + pos.Y++ + if includeCR { + pos.X = 0 + } + h.updatePos(pos) + return false, nil + } else { + // The cursor is at the bottom of the screen but outside the scroll + // region. Skip the LF. + h.logf("Simulating LF outside scroll region") + if includeCR { + if err := h.Flush(); err != nil { + return false, err + } + pos.X = 0 + if err := SetConsoleCursorPosition(h.fd, pos); err != nil { + return false, err + } + } + return true, nil + } +} + +// executeLF executes a LF without a CR. +func (h *windowsAnsiEventHandler) executeLF() error { + handled, err := h.simulateLF(false) + if err != nil { + return err + } + if !handled { + // Windows LF will reset the cursor column position. Write the LF + // and restore the cursor position. + pos, _, err := h.getCurrentInfo() + if err != nil { + return err + } + h.buffer.WriteByte(ansiterm.ANSI_LINE_FEED) + if pos.X != 0 { + if err := h.Flush(); err != nil { + return err + } + h.logf("Resetting cursor position for LF without CR") + if err := SetConsoleCursorPosition(h.fd, pos); err != nil { + return err + } + } + } + return nil +} + +func (h *windowsAnsiEventHandler) Print(b byte) error { + if h.wrapNext { + h.buffer.WriteByte(h.marginByte) + h.clearWrap() + if _, err := h.simulateLF(true); err != nil { + return err + } + } + pos, info, err := h.getCurrentInfo() + if err != nil { + return err + } + if pos.X == info.Size.X-1 { + h.wrapNext = true + h.marginByte = b + } else { + pos.X++ + h.updatePos(pos) + h.buffer.WriteByte(b) + } + return nil +} + +func (h *windowsAnsiEventHandler) Execute(b byte) error { + switch b { + case ansiterm.ANSI_TAB: + h.logf("Execute(TAB)") + // Move to the next tab stop, but preserve auto-wrap if already set. + if !h.wrapNext { + pos, info, err := h.getCurrentInfo() + if err != nil { + return err + } + pos.X = (pos.X + 8) - pos.X%8 + if pos.X >= info.Size.X { + pos.X = info.Size.X - 1 + } + if err := h.Flush(); err != nil { + return err + } + if err := SetConsoleCursorPosition(h.fd, pos); err != nil { + return err + } + } + return nil + + case ansiterm.ANSI_BEL: + h.buffer.WriteByte(ansiterm.ANSI_BEL) + return nil + + case ansiterm.ANSI_BACKSPACE: + if h.wrapNext { + if err := h.Flush(); err != nil { + return err + } + h.clearWrap() + } + pos, _, err := h.getCurrentInfo() + if err != nil { + return err + } + if pos.X > 0 { + pos.X-- + h.updatePos(pos) + h.buffer.WriteByte(ansiterm.ANSI_BACKSPACE) + } + return nil + + case ansiterm.ANSI_VERTICAL_TAB, ansiterm.ANSI_FORM_FEED: + // Treat as true LF. + return h.executeLF() + + case ansiterm.ANSI_LINE_FEED: + // Simulate a CR and LF for now since there is no way in go-ansiterm + // to tell if the LF should include CR (and more things break when it's + // missing than when it's incorrectly added). + handled, err := h.simulateLF(true) + if handled || err != nil { + return err + } + return h.buffer.WriteByte(ansiterm.ANSI_LINE_FEED) + + case ansiterm.ANSI_CARRIAGE_RETURN: + if h.wrapNext { + if err := h.Flush(); err != nil { + return err + } + h.clearWrap() + } + pos, _, err := h.getCurrentInfo() + if err != nil { + return err + } + if pos.X != 0 { + pos.X = 0 + h.updatePos(pos) + h.buffer.WriteByte(ansiterm.ANSI_CARRIAGE_RETURN) + } + return nil + + default: + return nil + } +} + +func (h *windowsAnsiEventHandler) CUU(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CUU: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorVertical(-param) +} + +func (h *windowsAnsiEventHandler) CUD(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CUD: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorVertical(param) +} + +func (h *windowsAnsiEventHandler) CUF(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CUF: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorHorizontal(param) +} + +func (h *windowsAnsiEventHandler) CUB(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CUB: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorHorizontal(-param) +} + +func (h *windowsAnsiEventHandler) CNL(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CNL: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorLine(param) +} + +func (h *windowsAnsiEventHandler) CPL(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CPL: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorLine(-param) +} + +func (h *windowsAnsiEventHandler) CHA(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CHA: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.moveCursorColumn(param) +} + +func (h *windowsAnsiEventHandler) VPA(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("VPA: [[%d]]", param) + h.clearWrap() + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + window := h.getCursorWindow(info) + position := info.CursorPosition + position.Y = window.Top + int16(param) - 1 + return h.setCursorPosition(position, window) +} + +func (h *windowsAnsiEventHandler) CUP(row int, col int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("CUP: [[%d %d]]", row, col) + h.clearWrap() + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + window := h.getCursorWindow(info) + position := COORD{window.Left + int16(col) - 1, window.Top + int16(row) - 1} + return h.setCursorPosition(position, window) +} + +func (h *windowsAnsiEventHandler) HVP(row int, col int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("HVP: [[%d %d]]", row, col) + h.clearWrap() + return h.CUP(row, col) +} + +func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DECTCEM: [%v]", []string{strconv.FormatBool(visible)}) + h.clearWrap() + return nil +} + +func (h *windowsAnsiEventHandler) DECOM(enable bool) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DECOM: [%v]", []string{strconv.FormatBool(enable)}) + h.clearWrap() + h.originMode = enable + return h.CUP(1, 1) +} + +func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DECCOLM: [%v]", []string{strconv.FormatBool(use132)}) + h.clearWrap() + if err := h.ED(2); err != nil { + return err + } + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + targetWidth := int16(80) + if use132 { + targetWidth = 132 + } + if info.Size.X < targetWidth { + if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { + h.logf("set buffer failed: %v", err) + return err + } + } + window := info.Window + window.Left = 0 + window.Right = targetWidth - 1 + if err := SetConsoleWindowInfo(h.fd, true, window); err != nil { + h.logf("set window failed: %v", err) + return err + } + if info.Size.X > targetWidth { + if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { + h.logf("set buffer failed: %v", err) + return err + } + } + return SetConsoleCursorPosition(h.fd, COORD{0, 0}) +} + +func (h *windowsAnsiEventHandler) ED(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("ED: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + + // [J -- Erases from the cursor to the end of the screen, including the cursor position. + // [1J -- Erases from the beginning of the screen to the cursor, including the cursor position. + // [2J -- Erases the complete display. The cursor does not move. + // Notes: + // -- Clearing the entire buffer, versus just the Window, works best for Windows Consoles + + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + var start COORD + var end COORD + + switch param { + case 0: + start = info.CursorPosition + end = COORD{info.Size.X - 1, info.Size.Y - 1} + + case 1: + start = COORD{0, 0} + end = info.CursorPosition + + case 2: + start = COORD{0, 0} + end = COORD{info.Size.X - 1, info.Size.Y - 1} + } + + err = h.clearRange(h.attributes, start, end) + if err != nil { + return err + } + + // If the whole buffer was cleared, move the window to the top while preserving + // the window-relative cursor position. + if param == 2 { + pos := info.CursorPosition + window := info.Window + pos.Y -= window.Top + window.Bottom -= window.Top + window.Top = 0 + if err := SetConsoleCursorPosition(h.fd, pos); err != nil { + return err + } + if err := SetConsoleWindowInfo(h.fd, true, window); err != nil { + return err + } + } + + return nil +} + +func (h *windowsAnsiEventHandler) EL(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("EL: [%v]", strconv.Itoa(param)) + h.clearWrap() + + // [K -- Erases from the cursor to the end of the line, including the cursor position. + // [1K -- Erases from the beginning of the line to the cursor, including the cursor position. + // [2K -- Erases the complete line. + + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + var start COORD + var end COORD + + switch param { + case 0: + start = info.CursorPosition + end = COORD{info.Size.X, info.CursorPosition.Y} + + case 1: + start = COORD{0, info.CursorPosition.Y} + end = info.CursorPosition + + case 2: + start = COORD{0, info.CursorPosition.Y} + end = COORD{info.Size.X, info.CursorPosition.Y} + } + + err = h.clearRange(h.attributes, start, end) + if err != nil { + return err + } + + return nil +} + +func (h *windowsAnsiEventHandler) IL(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("IL: [%v]", strconv.Itoa(param)) + h.clearWrap() + return h.insertLines(param) +} + +func (h *windowsAnsiEventHandler) DL(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DL: [%v]", strconv.Itoa(param)) + h.clearWrap() + return h.deleteLines(param) +} + +func (h *windowsAnsiEventHandler) ICH(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("ICH: [%v]", strconv.Itoa(param)) + h.clearWrap() + return h.insertCharacters(param) +} + +func (h *windowsAnsiEventHandler) DCH(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DCH: [%v]", strconv.Itoa(param)) + h.clearWrap() + return h.deleteCharacters(param) +} + +func (h *windowsAnsiEventHandler) SGR(params []int) error { + if err := h.Flush(); err != nil { + return err + } + strings := []string{} + for _, v := range params { + strings = append(strings, strconv.Itoa(v)) + } + + h.logf("SGR: [%v]", strings) + + if len(params) <= 0 { + h.attributes = h.infoReset.Attributes + h.inverted = false + } else { + for _, attr := range params { + + if attr == ansiterm.ANSI_SGR_RESET { + h.attributes = h.infoReset.Attributes + h.inverted = false + continue + } + + h.attributes, h.inverted = collectAnsiIntoWindowsAttributes(h.attributes, h.inverted, h.infoReset.Attributes, int16(attr)) + } + } + + attributes := h.attributes + if h.inverted { + attributes = invertAttributes(attributes) + } + err := SetConsoleTextAttribute(h.fd, attributes) + if err != nil { + return err + } + + return nil +} + +func (h *windowsAnsiEventHandler) SU(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("SU: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.scrollUp(param) +} + +func (h *windowsAnsiEventHandler) SD(param int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("SD: [%v]", []string{strconv.Itoa(param)}) + h.clearWrap() + return h.scrollDown(param) +} + +func (h *windowsAnsiEventHandler) DA(params []string) error { + h.logf("DA: [%v]", params) + // DA cannot be implemented because it must send data on the VT100 input stream, + // which is not available to go-ansiterm. + return nil +} + +func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error { + if err := h.Flush(); err != nil { + return err + } + h.logf("DECSTBM: [%d, %d]", top, bottom) + + // Windows is 0 indexed, Linux is 1 indexed + h.sr.top = int16(top - 1) + h.sr.bottom = int16(bottom - 1) + + // This command also moves the cursor to the origin. + h.clearWrap() + return h.CUP(1, 1) +} + +func (h *windowsAnsiEventHandler) RI() error { + if err := h.Flush(); err != nil { + return err + } + h.logf("RI: []") + h.clearWrap() + + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + sr := h.effectiveSr(info.Window) + if info.CursorPosition.Y == sr.top { + return h.scrollDown(1) + } + + return h.moveCursorVertical(-1) +} + +func (h *windowsAnsiEventHandler) IND() error { + h.logf("IND: []") + return h.executeLF() +} + +func (h *windowsAnsiEventHandler) Flush() error { + h.curInfo = nil + if h.buffer.Len() > 0 { + h.logf("Flush: [%s]", h.buffer.Bytes()) + if _, err := h.buffer.WriteTo(h.file); err != nil { + return err + } + } + + if h.wrapNext && !h.drewMarginByte { + h.logf("Flush: drawing margin byte '%c'", h.marginByte) + + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return err + } + + charInfo := []CHAR_INFO{{UnicodeChar: uint16(h.marginByte), Attributes: info.Attributes}} + size := COORD{1, 1} + position := COORD{0, 0} + region := SMALL_RECT{Left: info.CursorPosition.X, Top: info.CursorPosition.Y, Right: info.CursorPosition.X, Bottom: info.CursorPosition.Y} + if err := WriteConsoleOutput(h.fd, charInfo, size, position, ®ion); err != nil { + return err + } + h.drewMarginByte = true + } + return nil +} + +// cacheConsoleInfo ensures that the current console screen information has been queried +// since the last call to Flush(). It must be called before accessing h.curInfo or h.curPos. +func (h *windowsAnsiEventHandler) getCurrentInfo() (COORD, *CONSOLE_SCREEN_BUFFER_INFO, error) { + if h.curInfo == nil { + info, err := GetConsoleScreenBufferInfo(h.fd) + if err != nil { + return COORD{}, nil, err + } + h.curInfo = info + h.curPos = info.CursorPosition + } + return h.curPos, h.curInfo, nil +} + +func (h *windowsAnsiEventHandler) updatePos(pos COORD) { + if h.curInfo == nil { + panic("failed to call getCurrentInfo before calling updatePos") + } + h.curPos = pos +} + +// clearWrap clears the state where the cursor is in the margin +// waiting for the next character before wrapping the line. This must +// be done before most operations that act on the cursor. +func (h *windowsAnsiEventHandler) clearWrap() { + h.wrapNext = false + h.drewMarginByte = false +} diff --git a/vendor/github.com/Microsoft/go-winio/.gitignore b/vendor/github.com/Microsoft/go-winio/.gitignore new file mode 100644 index 00000000..b883f1fd --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/vendor/github.com/Microsoft/go-winio/CODEOWNERS b/vendor/github.com/Microsoft/go-winio/CODEOWNERS new file mode 100644 index 00000000..ae1b4942 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/CODEOWNERS @@ -0,0 +1 @@ + * @microsoft/containerplat diff --git a/vendor/github.com/Microsoft/go-winio/LICENSE b/vendor/github.com/Microsoft/go-winio/LICENSE new file mode 100644 index 00000000..b8b569d7 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/github.com/Microsoft/go-winio/README.md b/vendor/github.com/Microsoft/go-winio/README.md new file mode 100644 index 00000000..56800105 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/README.md @@ -0,0 +1,22 @@ +# go-winio + +This repository contains utilities for efficiently performing Win32 IO operations in +Go. Currently, this is focused on accessing named pipes and other file handles, and +for using named pipes as a net transport. + +This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go +to reuse the thread to schedule another goroutine. This limits support to Windows Vista and +newer operating systems. This is similar to the implementation of network sockets in Go's net +package. + +Please see the LICENSE file for licensing information. + +This project has adopted the [Microsoft Open Source Code of +Conduct](https://opensource.microsoft.com/codeofconduct/). For more information +see the [Code of Conduct +FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact +[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional +questions or comments. + +Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe +for another named pipe implementation. diff --git a/vendor/github.com/Microsoft/go-winio/backup.go b/vendor/github.com/Microsoft/go-winio/backup.go new file mode 100644 index 00000000..2be34af4 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/backup.go @@ -0,0 +1,280 @@ +// +build windows + +package winio + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "syscall" + "unicode/utf16" +) + +//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead +//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite + +const ( + BackupData = uint32(iota + 1) + BackupEaData + BackupSecurity + BackupAlternateData + BackupLink + BackupPropertyData + BackupObjectId + BackupReparseData + BackupSparseBlock + BackupTxfsData +) + +const ( + StreamSparseAttributes = uint32(8) +) + +const ( + WRITE_DAC = 0x40000 + WRITE_OWNER = 0x80000 + ACCESS_SYSTEM_SECURITY = 0x1000000 +) + +// BackupHeader represents a backup stream of a file. +type BackupHeader struct { + Id uint32 // The backup stream ID + Attributes uint32 // Stream attributes + Size int64 // The size of the stream in bytes + Name string // The name of the stream (for BackupAlternateData only). + Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). +} + +type win32StreamId struct { + StreamId uint32 + Attributes uint32 + Size uint64 + NameSize uint32 +} + +// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series +// of BackupHeader values. +type BackupStreamReader struct { + r io.Reader + bytesLeft int64 +} + +// NewBackupStreamReader produces a BackupStreamReader from any io.Reader. +func NewBackupStreamReader(r io.Reader) *BackupStreamReader { + return &BackupStreamReader{r, 0} +} + +// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if +// it was not completely read. +func (r *BackupStreamReader) Next() (*BackupHeader, error) { + if r.bytesLeft > 0 { + if s, ok := r.r.(io.Seeker); ok { + // Make sure Seek on io.SeekCurrent sometimes succeeds + // before trying the actual seek. + if _, err := s.Seek(0, io.SeekCurrent); err == nil { + if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { + return nil, err + } + r.bytesLeft = 0 + } + } + if _, err := io.Copy(ioutil.Discard, r); err != nil { + return nil, err + } + } + var wsi win32StreamId + if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { + return nil, err + } + hdr := &BackupHeader{ + Id: wsi.StreamId, + Attributes: wsi.Attributes, + Size: int64(wsi.Size), + } + if wsi.NameSize != 0 { + name := make([]uint16, int(wsi.NameSize/2)) + if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { + return nil, err + } + hdr.Name = syscall.UTF16ToString(name) + } + if wsi.StreamId == BackupSparseBlock { + if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { + return nil, err + } + hdr.Size -= 8 + } + r.bytesLeft = hdr.Size + return hdr, nil +} + +// Read reads from the current backup stream. +func (r *BackupStreamReader) Read(b []byte) (int, error) { + if r.bytesLeft == 0 { + return 0, io.EOF + } + if int64(len(b)) > r.bytesLeft { + b = b[:r.bytesLeft] + } + n, err := r.r.Read(b) + r.bytesLeft -= int64(n) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } else if r.bytesLeft == 0 && err == nil { + err = io.EOF + } + return n, err +} + +// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. +type BackupStreamWriter struct { + w io.Writer + bytesLeft int64 +} + +// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. +func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { + return &BackupStreamWriter{w, 0} +} + +// WriteHeader writes the next backup stream header and prepares for calls to Write(). +func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { + if w.bytesLeft != 0 { + return fmt.Errorf("missing %d bytes", w.bytesLeft) + } + name := utf16.Encode([]rune(hdr.Name)) + wsi := win32StreamId{ + StreamId: hdr.Id, + Attributes: hdr.Attributes, + Size: uint64(hdr.Size), + NameSize: uint32(len(name) * 2), + } + if hdr.Id == BackupSparseBlock { + // Include space for the int64 block offset + wsi.Size += 8 + } + if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { + return err + } + if len(name) != 0 { + if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { + return err + } + } + if hdr.Id == BackupSparseBlock { + if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { + return err + } + } + w.bytesLeft = hdr.Size + return nil +} + +// Write writes to the current backup stream. +func (w *BackupStreamWriter) Write(b []byte) (int, error) { + if w.bytesLeft < int64(len(b)) { + return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) + } + n, err := w.w.Write(b) + w.bytesLeft -= int64(n) + return n, err +} + +// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. +type BackupFileReader struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, +// Read will attempt to read the security descriptor of the file. +func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { + r := &BackupFileReader{f, includeSecurity, 0} + return r +} + +// Read reads a backup stream from the file by calling the Win32 API BackupRead(). +func (r *BackupFileReader) Read(b []byte) (int, error) { + var bytesRead uint32 + err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) + if err != nil { + return 0, &os.PathError{"BackupRead", r.f.Name(), err} + } + runtime.KeepAlive(r.f) + if bytesRead == 0 { + return 0, io.EOF + } + return int(bytesRead), nil +} + +// Close frees Win32 resources associated with the BackupFileReader. It does not close +// the underlying file. +func (r *BackupFileReader) Close() error { + if r.ctx != 0 { + backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) + runtime.KeepAlive(r.f) + r.ctx = 0 + } + return nil +} + +// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. +type BackupFileWriter struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, +// Write() will attempt to restore the security descriptor from the stream. +func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { + w := &BackupFileWriter{f, includeSecurity, 0} + return w +} + +// Write restores a portion of the file using the provided backup stream. +func (w *BackupFileWriter) Write(b []byte) (int, error) { + var bytesWritten uint32 + err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) + if err != nil { + return 0, &os.PathError{"BackupWrite", w.f.Name(), err} + } + runtime.KeepAlive(w.f) + if int(bytesWritten) != len(b) { + return int(bytesWritten), errors.New("not all bytes could be written") + } + return len(b), nil +} + +// Close frees Win32 resources associated with the BackupFileWriter. It does not +// close the underlying file. +func (w *BackupFileWriter) Close() error { + if w.ctx != 0 { + backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) + runtime.KeepAlive(w.f) + w.ctx = 0 + } + return nil +} + +// OpenForBackup opens a file or directory, potentially skipping access checks if the backup +// or restore privileges have been acquired. +// +// If the file opened was a directory, it cannot be used with Readdir(). +func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { + winPath, err := syscall.UTF16FromString(path) + if err != nil { + return nil, err + } + h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) + if err != nil { + err = &os.PathError{Op: "open", Path: path, Err: err} + return nil, err + } + return os.NewFile(uintptr(h), path), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/ea.go b/vendor/github.com/Microsoft/go-winio/ea.go new file mode 100644 index 00000000..4051c1b3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/ea.go @@ -0,0 +1,137 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "errors" +) + +type fileFullEaInformation struct { + NextEntryOffset uint32 + Flags uint8 + NameLength uint8 + ValueLength uint16 +} + +var ( + fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) + + errInvalidEaBuffer = errors.New("invalid extended attribute buffer") + errEaNameTooLarge = errors.New("extended attribute name too large") + errEaValueTooLarge = errors.New("extended attribute value too large") +) + +// ExtendedAttribute represents a single Windows EA. +type ExtendedAttribute struct { + Name string + Value []byte + Flags uint8 +} + +func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { + var info fileFullEaInformation + err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) + if err != nil { + err = errInvalidEaBuffer + return + } + + nameOffset := fileFullEaInformationSize + nameLen := int(info.NameLength) + valueOffset := nameOffset + int(info.NameLength) + 1 + valueLen := int(info.ValueLength) + nextOffset := int(info.NextEntryOffset) + if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { + err = errInvalidEaBuffer + return + } + + ea.Name = string(b[nameOffset : nameOffset+nameLen]) + ea.Value = b[valueOffset : valueOffset+valueLen] + ea.Flags = info.Flags + if info.NextEntryOffset != 0 { + nb = b[info.NextEntryOffset:] + } + return +} + +// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION +// buffer retrieved from BackupRead, ZwQueryEaFile, etc. +func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { + for len(b) != 0 { + ea, nb, err := parseEa(b) + if err != nil { + return nil, err + } + + eas = append(eas, ea) + b = nb + } + return +} + +func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { + if int(uint8(len(ea.Name))) != len(ea.Name) { + return errEaNameTooLarge + } + if int(uint16(len(ea.Value))) != len(ea.Value) { + return errEaValueTooLarge + } + entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) + withPadding := (entrySize + 3) &^ 3 + nextOffset := uint32(0) + if !last { + nextOffset = withPadding + } + info := fileFullEaInformation{ + NextEntryOffset: nextOffset, + Flags: ea.Flags, + NameLength: uint8(len(ea.Name)), + ValueLength: uint16(len(ea.Value)), + } + + err := binary.Write(buf, binary.LittleEndian, &info) + if err != nil { + return err + } + + _, err = buf.Write([]byte(ea.Name)) + if err != nil { + return err + } + + err = buf.WriteByte(0) + if err != nil { + return err + } + + _, err = buf.Write(ea.Value) + if err != nil { + return err + } + + _, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) + if err != nil { + return err + } + + return nil +} + +// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION +// buffer for use with BackupWrite, ZwSetEaFile, etc. +func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { + var buf bytes.Buffer + for i := range eas { + last := false + if i == len(eas)-1 { + last = true + } + + err := writeEa(&buf, &eas[i], last) + if err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go new file mode 100644 index 00000000..0385e410 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/file.go @@ -0,0 +1,323 @@ +// +build windows + +package winio + +import ( + "errors" + "io" + "runtime" + "sync" + "sync/atomic" + "syscall" + "time" +) + +//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx +//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort +//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus +//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes +//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult + +type atomicBool int32 + +func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 } +func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) } +func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) } +func (b *atomicBool) swap(new bool) bool { + var newInt int32 + if new { + newInt = 1 + } + return atomic.SwapInt32((*int32)(b), newInt) == 1 +} + +const ( + cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + cFILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +var ( + ErrFileClosed = errors.New("file has already been closed") + ErrTimeout = &timeoutError{} +) + +type timeoutError struct{} + +func (e *timeoutError) Error() string { return "i/o timeout" } +func (e *timeoutError) Timeout() bool { return true } +func (e *timeoutError) Temporary() bool { return true } + +type timeoutChan chan struct{} + +var ioInitOnce sync.Once +var ioCompletionPort syscall.Handle + +// ioResult contains the result of an asynchronous IO operation +type ioResult struct { + bytes uint32 + err error +} + +// ioOperation represents an outstanding asynchronous Win32 IO +type ioOperation struct { + o syscall.Overlapped + ch chan ioResult +} + +func initIo() { + h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff) + if err != nil { + panic(err) + } + ioCompletionPort = h + go ioCompletionProcessor(h) +} + +// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. +// It takes ownership of this handle and will close it if it is garbage collected. +type win32File struct { + handle syscall.Handle + wg sync.WaitGroup + wgLock sync.RWMutex + closing atomicBool + socket bool + readDeadline deadlineHandler + writeDeadline deadlineHandler +} + +type deadlineHandler struct { + setLock sync.Mutex + channel timeoutChan + channelLock sync.RWMutex + timer *time.Timer + timedout atomicBool +} + +// makeWin32File makes a new win32File from an existing file handle +func makeWin32File(h syscall.Handle) (*win32File, error) { + f := &win32File{handle: h} + ioInitOnce.Do(initIo) + _, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) + if err != nil { + return nil, err + } + err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE) + if err != nil { + return nil, err + } + f.readDeadline.channel = make(timeoutChan) + f.writeDeadline.channel = make(timeoutChan) + return f, nil +} + +func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { + // If we return the result of makeWin32File directly, it can result in an + // interface-wrapped nil, rather than a nil interface value. + f, err := makeWin32File(h) + if err != nil { + return nil, err + } + return f, nil +} + +// closeHandle closes the resources associated with a Win32 handle +func (f *win32File) closeHandle() { + f.wgLock.Lock() + // Atomically set that we are closing, releasing the resources only once. + if !f.closing.swap(true) { + f.wgLock.Unlock() + // cancel all IO and wait for it to complete + cancelIoEx(f.handle, nil) + f.wg.Wait() + // at this point, no new IO can start + syscall.Close(f.handle) + f.handle = 0 + } else { + f.wgLock.Unlock() + } +} + +// Close closes a win32File. +func (f *win32File) Close() error { + f.closeHandle() + return nil +} + +// prepareIo prepares for a new IO operation. +// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. +func (f *win32File) prepareIo() (*ioOperation, error) { + f.wgLock.RLock() + if f.closing.isSet() { + f.wgLock.RUnlock() + return nil, ErrFileClosed + } + f.wg.Add(1) + f.wgLock.RUnlock() + c := &ioOperation{} + c.ch = make(chan ioResult) + return c, nil +} + +// ioCompletionProcessor processes completed async IOs forever +func ioCompletionProcessor(h syscall.Handle) { + for { + var bytes uint32 + var key uintptr + var op *ioOperation + err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE) + if op == nil { + panic(err) + } + op.ch <- ioResult{bytes, err} + } +} + +// asyncIo processes the return value from ReadFile or WriteFile, blocking until +// the operation has actually completed. +func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { + if err != syscall.ERROR_IO_PENDING { + return int(bytes), err + } + + if f.closing.isSet() { + cancelIoEx(f.handle, &c.o) + } + + var timeout timeoutChan + if d != nil { + d.channelLock.Lock() + timeout = d.channel + d.channelLock.Unlock() + } + + var r ioResult + select { + case r = <-c.ch: + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + if f.closing.isSet() { + err = ErrFileClosed + } + } else if err != nil && f.socket { + // err is from Win32. Query the overlapped structure to get the winsock error. + var bytes, flags uint32 + err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) + } + case <-timeout: + cancelIoEx(f.handle, &c.o) + r = <-c.ch + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + err = ErrTimeout + } + } + + // runtime.KeepAlive is needed, as c is passed via native + // code to ioCompletionProcessor, c must remain alive + // until the channel read is complete. + runtime.KeepAlive(c) + return int(r.bytes), err +} + +// Read reads from a file handle. +func (f *win32File) Read(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.readDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.ReadFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.readDeadline, bytes, err) + runtime.KeepAlive(b) + + // Handle EOF conditions. + if err == nil && n == 0 && len(b) != 0 { + return 0, io.EOF + } else if err == syscall.ERROR_BROKEN_PIPE { + return 0, io.EOF + } else { + return n, err + } +} + +// Write writes to a file handle. +func (f *win32File) Write(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.writeDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.WriteFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.writeDeadline, bytes, err) + runtime.KeepAlive(b) + return n, err +} + +func (f *win32File) SetReadDeadline(deadline time.Time) error { + return f.readDeadline.set(deadline) +} + +func (f *win32File) SetWriteDeadline(deadline time.Time) error { + return f.writeDeadline.set(deadline) +} + +func (f *win32File) Flush() error { + return syscall.FlushFileBuffers(f.handle) +} + +func (f *win32File) Fd() uintptr { + return uintptr(f.handle) +} + +func (d *deadlineHandler) set(deadline time.Time) error { + d.setLock.Lock() + defer d.setLock.Unlock() + + if d.timer != nil { + if !d.timer.Stop() { + <-d.channel + } + d.timer = nil + } + d.timedout.setFalse() + + select { + case <-d.channel: + d.channelLock.Lock() + d.channel = make(chan struct{}) + d.channelLock.Unlock() + default: + } + + if deadline.IsZero() { + return nil + } + + timeoutIO := func() { + d.timedout.setTrue() + close(d.channel) + } + + now := time.Now() + duration := deadline.Sub(now) + if deadline.After(now) { + // Deadline is in the future, set a timer to wait + d.timer = time.AfterFunc(duration, timeoutIO) + } else { + // Deadline is in the past. Cancel all pending IO now. + timeoutIO() + } + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/fileinfo.go b/vendor/github.com/Microsoft/go-winio/fileinfo.go new file mode 100644 index 00000000..3ab6bff6 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/fileinfo.go @@ -0,0 +1,73 @@ +// +build windows + +package winio + +import ( + "os" + "runtime" + "unsafe" + + "golang.org/x/sys/windows" +) + +// FileBasicInfo contains file access time and file attributes information. +type FileBasicInfo struct { + CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime + FileAttributes uint32 + pad uint32 // padding +} + +// GetFileBasicInfo retrieves times and attributes for a file. +func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { + bi := &FileBasicInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return bi, nil +} + +// SetFileBasicInfo sets times and attributes for a file. +func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { + if err := windows.SetFileInformationByHandle(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return nil +} + +// FileStandardInfo contains extended information for the file. +// FILE_STANDARD_INFO in WinBase.h +// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info +type FileStandardInfo struct { + AllocationSize, EndOfFile int64 + NumberOfLinks uint32 + DeletePending, Directory bool +} + +// GetFileStandardInfo retrieves ended information for the file. +func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) { + si := &FileStandardInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return si, nil +} + +// FileIDInfo contains the volume serial number and file ID for a file. This pair should be +// unique on a system. +type FileIDInfo struct { + VolumeSerialNumber uint64 + FileID [16]byte +} + +// GetFileID retrieves the unique (volume, file ID) pair for a file. +func GetFileID(f *os.File) (*FileIDInfo, error) { + fileID := &FileIDInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return fileID, nil +} diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go new file mode 100644 index 00000000..b632f8f8 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/hvsock.go @@ -0,0 +1,307 @@ +// +build windows + +package winio + +import ( + "fmt" + "io" + "net" + "os" + "syscall" + "time" + "unsafe" + + "github.com/Microsoft/go-winio/pkg/guid" +) + +//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind + +const ( + afHvSock = 34 // AF_HYPERV + + socketError = ^uintptr(0) +) + +// An HvsockAddr is an address for a AF_HYPERV socket. +type HvsockAddr struct { + VMID guid.GUID + ServiceID guid.GUID +} + +type rawHvsockAddr struct { + Family uint16 + _ uint16 + VMID guid.GUID + ServiceID guid.GUID +} + +// Network returns the address's network name, "hvsock". +func (addr *HvsockAddr) Network() string { + return "hvsock" +} + +func (addr *HvsockAddr) String() string { + return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) +} + +// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. +func VsockServiceID(port uint32) guid.GUID { + g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") + g.Data1 = port + return g +} + +func (addr *HvsockAddr) raw() rawHvsockAddr { + return rawHvsockAddr{ + Family: afHvSock, + VMID: addr.VMID, + ServiceID: addr.ServiceID, + } +} + +func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { + addr.VMID = raw.VMID + addr.ServiceID = raw.ServiceID +} + +// HvsockListener is a socket listener for the AF_HYPERV address family. +type HvsockListener struct { + sock *win32File + addr HvsockAddr +} + +// HvsockConn is a connected socket of the AF_HYPERV address family. +type HvsockConn struct { + sock *win32File + local, remote HvsockAddr +} + +func newHvSocket() (*win32File, error) { + fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + f, err := makeWin32File(fd) + if err != nil { + syscall.Close(fd) + return nil, err + } + f.socket = true + return f, nil +} + +// ListenHvsock listens for connections on the specified hvsock address. +func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { + l := &HvsockListener{addr: *addr} + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("listen", err) + } + sa := addr.raw() + err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("socket", err)) + } + err = syscall.Listen(sock.handle, 16) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("listen", err)) + } + return &HvsockListener{sock: sock, addr: *addr}, nil +} + +func (l *HvsockListener) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} +} + +// Addr returns the listener's network address. +func (l *HvsockListener) Addr() net.Addr { + return &l.addr +} + +// Accept waits for the next connection and returns it. +func (l *HvsockListener) Accept() (_ net.Conn, err error) { + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("accept", err) + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := l.sock.prepareIo() + if err != nil { + return nil, l.opErr("accept", err) + } + defer l.sock.wg.Done() + + // AcceptEx, per documentation, requires an extra 16 bytes per address. + const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) + var addrbuf [addrlen * 2]byte + + var bytes uint32 + err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) + _, err = l.sock.asyncIo(c, nil, bytes, err) + if err != nil { + return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) + } + conn := &HvsockConn{ + sock: sock, + } + conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) + conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) + sock = nil + return conn, nil +} + +// Close closes the listener, causing any pending Accept calls to fail. +func (l *HvsockListener) Close() error { + return l.sock.Close() +} + +/* Need to finish ConnectEx handling +func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { + sock, err := newHvSocket() + if err != nil { + return nil, err + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := sock.prepareIo() + if err != nil { + return nil, err + } + defer sock.wg.Done() + var bytes uint32 + err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) + _, err = sock.asyncIo(ctx, c, nil, bytes, err) + if err != nil { + return nil, err + } + conn := &HvsockConn{ + sock: sock, + remote: *addr, + } + sock = nil + return conn, nil +} +*/ + +func (conn *HvsockConn) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} +} + +func (conn *HvsockConn) Read(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("read", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var flags, bytes uint32 + err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsarecv", err) + } + return 0, conn.opErr("read", err) + } else if n == 0 { + err = io.EOF + } + return n, err +} + +func (conn *HvsockConn) Write(b []byte) (int, error) { + t := 0 + for len(b) != 0 { + n, err := conn.write(b) + if err != nil { + return t + n, err + } + t += n + b = b[n:] + } + return t, nil +} + +func (conn *HvsockConn) write(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("write", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var bytes uint32 + err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsasend", err) + } + return 0, conn.opErr("write", err) + } + return n, err +} + +// Close closes the socket connection, failing any pending read or write calls. +func (conn *HvsockConn) Close() error { + return conn.sock.Close() +} + +func (conn *HvsockConn) shutdown(how int) error { + err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD) + if err != nil { + return os.NewSyscallError("shutdown", err) + } + return nil +} + +// CloseRead shuts down the read end of the socket. +func (conn *HvsockConn) CloseRead() error { + err := conn.shutdown(syscall.SHUT_RD) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// CloseWrite shuts down the write end of the socket, notifying the other endpoint that +// no more data will be written. +func (conn *HvsockConn) CloseWrite() error { + err := conn.shutdown(syscall.SHUT_WR) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// LocalAddr returns the local address of the connection. +func (conn *HvsockConn) LocalAddr() net.Addr { + return &conn.local +} + +// RemoteAddr returns the remote address of the connection. +func (conn *HvsockConn) RemoteAddr() net.Addr { + return &conn.remote +} + +// SetDeadline implements the net.Conn SetDeadline method. +func (conn *HvsockConn) SetDeadline(t time.Time) error { + conn.SetReadDeadline(t) + conn.SetWriteDeadline(t) + return nil +} + +// SetReadDeadline implements the net.Conn SetReadDeadline method. +func (conn *HvsockConn) SetReadDeadline(t time.Time) error { + return conn.sock.SetReadDeadline(t) +} + +// SetWriteDeadline implements the net.Conn SetWriteDeadline method. +func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { + return conn.sock.SetWriteDeadline(t) +} diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go new file mode 100644 index 00000000..96700a73 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -0,0 +1,517 @@ +// +build windows + +package winio + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "os" + "runtime" + "syscall" + "time" + "unsafe" +) + +//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe +//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW +//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW +//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo +//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW +//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc +//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile +//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb +//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U +//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl + +type ioStatusBlock struct { + Status, Information uintptr +} + +type objectAttributes struct { + Length uintptr + RootDirectory uintptr + ObjectName *unicodeString + Attributes uintptr + SecurityDescriptor *securityDescriptor + SecurityQoS uintptr +} + +type unicodeString struct { + Length uint16 + MaximumLength uint16 + Buffer uintptr +} + +type securityDescriptor struct { + Revision byte + Sbz1 byte + Control uint16 + Owner uintptr + Group uintptr + Sacl uintptr + Dacl uintptr +} + +type ntstatus int32 + +func (status ntstatus) Err() error { + if status >= 0 { + return nil + } + return rtlNtStatusToDosError(status) +} + +const ( + cERROR_PIPE_BUSY = syscall.Errno(231) + cERROR_NO_DATA = syscall.Errno(232) + cERROR_PIPE_CONNECTED = syscall.Errno(535) + cERROR_SEM_TIMEOUT = syscall.Errno(121) + + cSECURITY_SQOS_PRESENT = 0x100000 + cSECURITY_ANONYMOUS = 0 + + cPIPE_TYPE_MESSAGE = 4 + + cPIPE_READMODE_MESSAGE = 2 + + cFILE_OPEN = 1 + cFILE_CREATE = 2 + + cFILE_PIPE_MESSAGE_TYPE = 1 + cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 + + cSE_DACL_PRESENT = 4 +) + +var ( + // ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. + // This error should match net.errClosing since docker takes a dependency on its text. + ErrPipeListenerClosed = errors.New("use of closed network connection") + + errPipeWriteClosed = errors.New("pipe has been closed for write") +) + +type win32Pipe struct { + *win32File + path string +} + +type win32MessageBytePipe struct { + win32Pipe + writeClosed bool + readEOF bool +} + +type pipeAddress string + +func (f *win32Pipe) LocalAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) RemoteAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) SetDeadline(t time.Time) error { + f.SetReadDeadline(t) + f.SetWriteDeadline(t) + return nil +} + +// CloseWrite closes the write side of a message pipe in byte mode. +func (f *win32MessageBytePipe) CloseWrite() error { + if f.writeClosed { + return errPipeWriteClosed + } + err := f.win32File.Flush() + if err != nil { + return err + } + _, err = f.win32File.Write(nil) + if err != nil { + return err + } + f.writeClosed = true + return nil +} + +// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since +// they are used to implement CloseWrite(). +func (f *win32MessageBytePipe) Write(b []byte) (int, error) { + if f.writeClosed { + return 0, errPipeWriteClosed + } + if len(b) == 0 { + return 0, nil + } + return f.win32File.Write(b) +} + +// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message +// mode pipe will return io.EOF, as will all subsequent reads. +func (f *win32MessageBytePipe) Read(b []byte) (int, error) { + if f.readEOF { + return 0, io.EOF + } + n, err := f.win32File.Read(b) + if err == io.EOF { + // If this was the result of a zero-byte read, then + // it is possible that the read was due to a zero-size + // message. Since we are simulating CloseWrite with a + // zero-byte message, ensure that all future Read() calls + // also return EOF. + f.readEOF = true + } else if err == syscall.ERROR_MORE_DATA { + // ERROR_MORE_DATA indicates that the pipe's read mode is message mode + // and the message still has more bytes. Treat this as a success, since + // this package presents all named pipes as byte streams. + err = nil + } + return n, err +} + +func (s pipeAddress) Network() string { + return "pipe" +} + +func (s pipeAddress) String() string { + return string(s) +} + +// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. +func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) { + for { + + select { + case <-ctx.Done(): + return syscall.Handle(0), ctx.Err() + default: + h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) + if err == nil { + return h, nil + } + if err != cERROR_PIPE_BUSY { + return h, &os.PathError{Err: err, Op: "open", Path: *path} + } + // Wait 10 msec and try again. This is a rather simplistic + // view, as we always try each 10 milliseconds. + time.Sleep(10 * time.Millisecond) + } + } +} + +// DialPipe connects to a named pipe by path, timing out if the connection +// takes longer than the specified duration. If timeout is nil, then we use +// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) +func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { + var absTimeout time.Time + if timeout != nil { + absTimeout = time.Now().Add(*timeout) + } else { + absTimeout = time.Now().Add(2 * time.Second) + } + ctx, _ := context.WithDeadline(context.Background(), absTimeout) + conn, err := DialPipeContext(ctx, path) + if err == context.DeadlineExceeded { + return nil, ErrTimeout + } + return conn, err +} + +// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` +// cancellation or timeout. +func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { + return DialPipeAccess(ctx, path, syscall.GENERIC_READ|syscall.GENERIC_WRITE) +} + +// DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx` +// cancellation or timeout. +func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) { + var err error + var h syscall.Handle + h, err = tryDialPipe(ctx, &path, access) + if err != nil { + return nil, err + } + + var flags uint32 + err = getNamedPipeInfo(h, &flags, nil, nil, nil) + if err != nil { + return nil, err + } + + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + + // If the pipe is in message mode, return a message byte pipe, which + // supports CloseWrite(). + if flags&cPIPE_TYPE_MESSAGE != 0 { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: f, path: path}, + }, nil + } + return &win32Pipe{win32File: f, path: path}, nil +} + +type acceptResponse struct { + f *win32File + err error +} + +type win32PipeListener struct { + firstHandle syscall.Handle + path string + config PipeConfig + acceptCh chan (chan acceptResponse) + closeCh chan int + doneCh chan int +} + +func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { + path16, err := syscall.UTF16FromString(path) + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + var oa objectAttributes + oa.Length = unsafe.Sizeof(oa) + + var ntPath unicodeString + if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + defer localFree(ntPath.Buffer) + oa.ObjectName = &ntPath + + // The security descriptor is only needed for the first pipe. + if first { + if sd != nil { + len := uint32(len(sd)) + sdb := localAlloc(0, len) + defer localFree(sdb) + copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) + oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) + } else { + // Construct the default named pipe security descriptor. + var dacl uintptr + if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { + return 0, fmt.Errorf("getting default named pipe ACL: %s", err) + } + defer localFree(dacl) + + sdb := &securityDescriptor{ + Revision: 1, + Control: cSE_DACL_PRESENT, + Dacl: dacl, + } + oa.SecurityDescriptor = sdb + } + } + + typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) + if c.MessageMode { + typ |= cFILE_PIPE_MESSAGE_TYPE + } + + disposition := uint32(cFILE_OPEN) + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) + if first { + disposition = cFILE_CREATE + // By not asking for read or write access, the named pipe file system + // will put this pipe into an initially disconnected state, blocking + // client connections until the next call with first == false. + access = syscall.SYNCHRONIZE + } + + timeout := int64(-50 * 10000) // 50ms + + var ( + h syscall.Handle + iosb ioStatusBlock + ) + err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + runtime.KeepAlive(ntPath) + return h, nil +} + +func (l *win32PipeListener) makeServerPipe() (*win32File, error) { + h, err := makeServerPipeHandle(l.path, nil, &l.config, false) + if err != nil { + return nil, err + } + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + return f, nil +} + +func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { + p, err := l.makeServerPipe() + if err != nil { + return nil, err + } + + // Wait for the client to connect. + ch := make(chan error) + go func(p *win32File) { + ch <- connectPipe(p) + }(p) + + select { + case err = <-ch: + if err != nil { + p.Close() + p = nil + } + case <-l.closeCh: + // Abort the connect request by closing the handle. + p.Close() + p = nil + err = <-ch + if err == nil || err == ErrFileClosed { + err = ErrPipeListenerClosed + } + } + return p, err +} + +func (l *win32PipeListener) listenerRoutine() { + closed := false + for !closed { + select { + case <-l.closeCh: + closed = true + case responseCh := <-l.acceptCh: + var ( + p *win32File + err error + ) + for { + p, err = l.makeConnectedServerPipe() + // If the connection was immediately closed by the client, try + // again. + if err != cERROR_NO_DATA { + break + } + } + responseCh <- acceptResponse{p, err} + closed = err == ErrPipeListenerClosed + } + } + syscall.Close(l.firstHandle) + l.firstHandle = 0 + // Notify Close() and Accept() callers that the handle has been closed. + close(l.doneCh) +} + +// PipeConfig contain configuration for the pipe listener. +type PipeConfig struct { + // SecurityDescriptor contains a Windows security descriptor in SDDL format. + SecurityDescriptor string + + // MessageMode determines whether the pipe is in byte or message mode. In either + // case the pipe is read in byte mode by default. The only practical difference in + // this implementation is that CloseWrite() is only supported for message mode pipes; + // CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only + // transferred to the reader (and returned as io.EOF in this implementation) + // when the pipe is in message mode. + MessageMode bool + + // InputBufferSize specifies the size of the input buffer, in bytes. + InputBufferSize int32 + + // OutputBufferSize specifies the size of the output buffer, in bytes. + OutputBufferSize int32 +} + +// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. +// The pipe must not already exist. +func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { + var ( + sd []byte + err error + ) + if c == nil { + c = &PipeConfig{} + } + if c.SecurityDescriptor != "" { + sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) + if err != nil { + return nil, err + } + } + h, err := makeServerPipeHandle(path, sd, c, true) + if err != nil { + return nil, err + } + l := &win32PipeListener{ + firstHandle: h, + path: path, + config: *c, + acceptCh: make(chan (chan acceptResponse)), + closeCh: make(chan int), + doneCh: make(chan int), + } + go l.listenerRoutine() + return l, nil +} + +func connectPipe(p *win32File) error { + c, err := p.prepareIo() + if err != nil { + return err + } + defer p.wg.Done() + + err = connectNamedPipe(p.handle, &c.o) + _, err = p.asyncIo(c, nil, 0, err) + if err != nil && err != cERROR_PIPE_CONNECTED { + return err + } + return nil +} + +func (l *win32PipeListener) Accept() (net.Conn, error) { + ch := make(chan acceptResponse) + select { + case l.acceptCh <- ch: + response := <-ch + err := response.err + if err != nil { + return nil, err + } + if l.config.MessageMode { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: response.f, path: l.path}, + }, nil + } + return &win32Pipe{win32File: response.f, path: l.path}, nil + case <-l.doneCh: + return nil, ErrPipeListenerClosed + } +} + +func (l *win32PipeListener) Close() error { + select { + case l.closeCh <- 1: + <-l.doneCh + case <-l.doneCh: + } + return nil +} + +func (l *win32PipeListener) Addr() net.Addr { + return pipeAddress(l.path) +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go new file mode 100644 index 00000000..f497c0e3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go @@ -0,0 +1,237 @@ +// +build windows + +// Package guid provides a GUID type. The backing structure for a GUID is +// identical to that used by the golang.org/x/sys/windows GUID type. +// There are two main binary encodings used for a GUID, the big-endian encoding, +// and the Windows (mixed-endian) encoding. See here for details: +// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding +package guid + +import ( + "crypto/rand" + "crypto/sha1" + "encoding" + "encoding/binary" + "fmt" + "strconv" + + "golang.org/x/sys/windows" +) + +// Variant specifies which GUID variant (or "type") of the GUID. It determines +// how the entirety of the rest of the GUID is interpreted. +type Variant uint8 + +// The variants specified by RFC 4122. +const ( + // VariantUnknown specifies a GUID variant which does not conform to one of + // the variant encodings specified in RFC 4122. + VariantUnknown Variant = iota + VariantNCS + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// Version specifies how the bits in the GUID were generated. For instance, a +// version 4 GUID is randomly generated, and a version 5 is generated from the +// hash of an input string. +type Version uint8 + +var _ = (encoding.TextMarshaler)(GUID{}) +var _ = (encoding.TextUnmarshaler)(&GUID{}) + +// GUID represents a GUID/UUID. It has the same structure as +// golang.org/x/sys/windows.GUID so that it can be used with functions expecting +// that type. It is defined as its own type so that stringification and +// marshaling can be supported. The representation matches that used by native +// Windows code. +type GUID windows.GUID + +// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. +func NewV4() (GUID, error) { + var b [16]byte + if _, err := rand.Read(b[:]); err != nil { + return GUID{}, err + } + + g := FromArray(b) + g.setVersion(4) // Version 4 means randomly generated. + g.setVariant(VariantRFC4122) + + return g, nil +} + +// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) +// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, +// and the sample code treats it as a series of bytes, so we do the same here. +// +// Some implementations, such as those found on Windows, treat the name as a +// big-endian UTF16 stream of bytes. If that is desired, the string can be +// encoded as such before being passed to this function. +func NewV5(namespace GUID, name []byte) (GUID, error) { + b := sha1.New() + namespaceBytes := namespace.ToArray() + b.Write(namespaceBytes[:]) + b.Write(name) + + a := [16]byte{} + copy(a[:], b.Sum(nil)) + + g := FromArray(a) + g.setVersion(5) // Version 5 means generated from a string. + g.setVariant(VariantRFC4122) + + return g, nil +} + +func fromArray(b [16]byte, order binary.ByteOrder) GUID { + var g GUID + g.Data1 = order.Uint32(b[0:4]) + g.Data2 = order.Uint16(b[4:6]) + g.Data3 = order.Uint16(b[6:8]) + copy(g.Data4[:], b[8:16]) + return g +} + +func (g GUID) toArray(order binary.ByteOrder) [16]byte { + b := [16]byte{} + order.PutUint32(b[0:4], g.Data1) + order.PutUint16(b[4:6], g.Data2) + order.PutUint16(b[6:8], g.Data3) + copy(b[8:16], g.Data4[:]) + return b +} + +// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. +func FromArray(b [16]byte) GUID { + return fromArray(b, binary.BigEndian) +} + +// ToArray returns an array of 16 bytes representing the GUID in big-endian +// encoding. +func (g GUID) ToArray() [16]byte { + return g.toArray(binary.BigEndian) +} + +// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. +func FromWindowsArray(b [16]byte) GUID { + return fromArray(b, binary.LittleEndian) +} + +// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows +// encoding. +func (g GUID) ToWindowsArray() [16]byte { + return g.toArray(binary.LittleEndian) +} + +func (g GUID) String() string { + return fmt.Sprintf( + "%08x-%04x-%04x-%04x-%012x", + g.Data1, + g.Data2, + g.Data3, + g.Data4[:2], + g.Data4[2:]) +} + +// FromString parses a string containing a GUID and returns the GUID. The only +// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +// format. +func FromString(s string) (GUID, error) { + if len(s) != 36 { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + + var g GUID + + data1, err := strconv.ParseUint(s[0:8], 16, 32) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data1 = uint32(data1) + + data2, err := strconv.ParseUint(s[9:13], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data2 = uint16(data2) + + data3, err := strconv.ParseUint(s[14:18], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data3 = uint16(data3) + + for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { + v, err := strconv.ParseUint(s[x:x+2], 16, 8) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data4[i] = uint8(v) + } + + return g, nil +} + +func (g *GUID) setVariant(v Variant) { + d := g.Data4[0] + switch v { + case VariantNCS: + d = (d & 0x7f) + case VariantRFC4122: + d = (d & 0x3f) | 0x80 + case VariantMicrosoft: + d = (d & 0x1f) | 0xc0 + case VariantFuture: + d = (d & 0x0f) | 0xe0 + case VariantUnknown: + fallthrough + default: + panic(fmt.Sprintf("invalid variant: %d", v)) + } + g.Data4[0] = d +} + +// Variant returns the GUID variant, as defined in RFC 4122. +func (g GUID) Variant() Variant { + b := g.Data4[0] + if b&0x80 == 0 { + return VariantNCS + } else if b&0xc0 == 0x80 { + return VariantRFC4122 + } else if b&0xe0 == 0xc0 { + return VariantMicrosoft + } else if b&0xe0 == 0xe0 { + return VariantFuture + } + return VariantUnknown +} + +func (g *GUID) setVersion(v Version) { + g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) +} + +// Version returns the GUID version, as defined in RFC 4122. +func (g GUID) Version() Version { + return Version((g.Data3 & 0xF000) >> 12) +} + +// MarshalText returns the textual representation of the GUID. +func (g GUID) MarshalText() ([]byte, error) { + return []byte(g.String()), nil +} + +// UnmarshalText takes the textual representation of a GUID, and unmarhals it +// into this GUID. +func (g *GUID) UnmarshalText(text []byte) error { + g2, err := FromString(string(text)) + if err != nil { + return err + } + *g = g2 + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/privilege.go b/vendor/github.com/Microsoft/go-winio/privilege.go new file mode 100644 index 00000000..9c83d36f --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/privilege.go @@ -0,0 +1,202 @@ +// +build windows + +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "runtime" + "sync" + "syscall" + "unicode/utf16" + + "golang.org/x/sys/windows" +) + +//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges +//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf +//sys revertToSelf() (err error) = advapi32.RevertToSelf +//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken +//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread +//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW +//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW +//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW + +const ( + SE_PRIVILEGE_ENABLED = 2 + + ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 + + SeBackupPrivilege = "SeBackupPrivilege" + SeRestorePrivilege = "SeRestorePrivilege" +) + +const ( + securityAnonymous = iota + securityIdentification + securityImpersonation + securityDelegation +) + +var ( + privNames = make(map[string]uint64) + privNameMutex sync.Mutex +) + +// PrivilegeError represents an error enabling privileges. +type PrivilegeError struct { + privileges []uint64 +} + +func (e *PrivilegeError) Error() string { + s := "" + if len(e.privileges) > 1 { + s = "Could not enable privileges " + } else { + s = "Could not enable privilege " + } + for i, p := range e.privileges { + if i != 0 { + s += ", " + } + s += `"` + s += getPrivilegeName(p) + s += `"` + } + return s +} + +// RunWithPrivilege enables a single privilege for a function call. +func RunWithPrivilege(name string, fn func() error) error { + return RunWithPrivileges([]string{name}, fn) +} + +// RunWithPrivileges enables privileges for a function call. +func RunWithPrivileges(names []string, fn func() error) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + token, err := newThreadToken() + if err != nil { + return err + } + defer releaseThreadToken(token) + err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) + if err != nil { + return err + } + return fn() +} + +func mapPrivileges(names []string) ([]uint64, error) { + var privileges []uint64 + privNameMutex.Lock() + defer privNameMutex.Unlock() + for _, name := range names { + p, ok := privNames[name] + if !ok { + err := lookupPrivilegeValue("", name, &p) + if err != nil { + return nil, err + } + privNames[name] = p + } + privileges = append(privileges, p) + } + return privileges, nil +} + +// EnableProcessPrivileges enables privileges globally for the process. +func EnableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) +} + +// DisableProcessPrivileges disables privileges globally for the process. +func DisableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, 0) +} + +func enableDisableProcessPrivilege(names []string, action uint32) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + + p, _ := windows.GetCurrentProcess() + var token windows.Token + err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) + if err != nil { + return err + } + + defer token.Close() + return adjustPrivileges(token, privileges, action) +} + +func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) + for _, p := range privileges { + binary.Write(&b, binary.LittleEndian, p) + binary.Write(&b, binary.LittleEndian, action) + } + prevState := make([]byte, b.Len()) + reqSize := uint32(0) + success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) + if !success { + return err + } + if err == ERROR_NOT_ALL_ASSIGNED { + return &PrivilegeError{privileges} + } + return nil +} + +func getPrivilegeName(luid uint64) string { + var nameBuffer [256]uint16 + bufSize := uint32(len(nameBuffer)) + err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) + if err != nil { + return fmt.Sprintf("", luid) + } + + var displayNameBuffer [256]uint16 + displayBufSize := uint32(len(displayNameBuffer)) + var langID uint32 + err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) + if err != nil { + return fmt.Sprintf("", string(utf16.Decode(nameBuffer[:bufSize]))) + } + + return string(utf16.Decode(displayNameBuffer[:displayBufSize])) +} + +func newThreadToken() (windows.Token, error) { + err := impersonateSelf(securityImpersonation) + if err != nil { + return 0, err + } + + var token windows.Token + err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token) + if err != nil { + rerr := revertToSelf() + if rerr != nil { + panic(rerr) + } + return 0, err + } + return token, nil +} + +func releaseThreadToken(h windows.Token) { + err := revertToSelf() + if err != nil { + panic(err) + } + h.Close() +} diff --git a/vendor/github.com/Microsoft/go-winio/reparse.go b/vendor/github.com/Microsoft/go-winio/reparse.go new file mode 100644 index 00000000..fc1ee4d3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/reparse.go @@ -0,0 +1,128 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "strings" + "unicode/utf16" + "unsafe" +) + +const ( + reparseTagMountPoint = 0xA0000003 + reparseTagSymlink = 0xA000000C +) + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 +} + +// ReparsePoint describes a Win32 symlink or mount point. +type ReparsePoint struct { + Target string + IsMountPoint bool +} + +// UnsupportedReparsePointError is returned when trying to decode a non-symlink or +// mount point reparse point. +type UnsupportedReparsePointError struct { + Tag uint32 +} + +func (e *UnsupportedReparsePointError) Error() string { + return fmt.Sprintf("unsupported reparse point %x", e.Tag) +} + +// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink +// or a mount point. +func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { + tag := binary.LittleEndian.Uint32(b[0:4]) + return DecodeReparsePointData(tag, b[8:]) +} + +func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { + isMountPoint := false + switch tag { + case reparseTagMountPoint: + isMountPoint = true + case reparseTagSymlink: + default: + return nil, &UnsupportedReparsePointError{tag} + } + nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) + if !isMountPoint { + nameOffset += 4 + } + nameLength := binary.LittleEndian.Uint16(b[6:8]) + name := make([]uint16, nameLength/2) + err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) + if err != nil { + return nil, err + } + return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil +} + +func isDriveLetter(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + +// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or +// mount point. +func EncodeReparsePoint(rp *ReparsePoint) []byte { + // Generate an NT path and determine if this is a relative path. + var ntTarget string + relative := false + if strings.HasPrefix(rp.Target, `\\?\`) { + ntTarget = `\??\` + rp.Target[4:] + } else if strings.HasPrefix(rp.Target, `\\`) { + ntTarget = `\??\UNC\` + rp.Target[2:] + } else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { + ntTarget = `\??\` + rp.Target + } else { + ntTarget = rp.Target + relative = true + } + + // The paths must be NUL-terminated even though they are counted strings. + target16 := utf16.Encode([]rune(rp.Target + "\x00")) + ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) + + size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 + size += len(ntTarget16)*2 + len(target16)*2 + + tag := uint32(reparseTagMountPoint) + if !rp.IsMountPoint { + tag = reparseTagSymlink + size += 4 // Add room for symlink flags + } + + data := reparseDataBuffer{ + ReparseTag: tag, + ReparseDataLength: uint16(size), + SubstituteNameOffset: 0, + SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), + PrintNameOffset: uint16(len(ntTarget16) * 2), + PrintNameLength: uint16((len(target16) - 1) * 2), + } + + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, &data) + if !rp.IsMountPoint { + flags := uint32(0) + if relative { + flags |= 1 + } + binary.Write(&b, binary.LittleEndian, flags) + } + + binary.Write(&b, binary.LittleEndian, ntTarget16) + binary.Write(&b, binary.LittleEndian, target16) + return b.Bytes() +} diff --git a/vendor/github.com/Microsoft/go-winio/sd.go b/vendor/github.com/Microsoft/go-winio/sd.go new file mode 100644 index 00000000..db1b370a --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/sd.go @@ -0,0 +1,98 @@ +// +build windows + +package winio + +import ( + "syscall" + "unsafe" +) + +//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW +//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW +//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW +//sys localFree(mem uintptr) = LocalFree +//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength + +const ( + cERROR_NONE_MAPPED = syscall.Errno(1332) +) + +type AccountLookupError struct { + Name string + Err error +} + +func (e *AccountLookupError) Error() string { + if e.Name == "" { + return "lookup account: empty account name specified" + } + var s string + switch e.Err { + case cERROR_NONE_MAPPED: + s = "not found" + default: + s = e.Err.Error() + } + return "lookup account " + e.Name + ": " + s +} + +type SddlConversionError struct { + Sddl string + Err error +} + +func (e *SddlConversionError) Error() string { + return "convert " + e.Sddl + ": " + e.Err.Error() +} + +// LookupSidByName looks up the SID of an account by name +func LookupSidByName(name string) (sid string, err error) { + if name == "" { + return "", &AccountLookupError{name, cERROR_NONE_MAPPED} + } + + var sidSize, sidNameUse, refDomainSize uint32 + err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) + if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { + return "", &AccountLookupError{name, err} + } + sidBuffer := make([]byte, sidSize) + refDomainBuffer := make([]uint16, refDomainSize) + err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) + if err != nil { + return "", &AccountLookupError{name, err} + } + var strBuffer *uint16 + err = convertSidToStringSid(&sidBuffer[0], &strBuffer) + if err != nil { + return "", &AccountLookupError{name, err} + } + sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) + localFree(uintptr(unsafe.Pointer(strBuffer))) + return sid, nil +} + +func SddlToSecurityDescriptor(sddl string) ([]byte, error) { + var sdBuffer uintptr + err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil) + if err != nil { + return nil, &SddlConversionError{sddl, err} + } + defer localFree(sdBuffer) + sd := make([]byte, getSecurityDescriptorLength(sdBuffer)) + copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)]) + return sd, nil +} + +func SecurityDescriptorToSddl(sd []byte) (string, error) { + var sddl *uint16 + // The returned string length seems to including an aribtrary number of terminating NULs. + // Don't use it. + err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil) + if err != nil { + return "", err + } + defer localFree(uintptr(unsafe.Pointer(sddl))) + return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go new file mode 100644 index 00000000..5955c99f --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/syscall.go @@ -0,0 +1,3 @@ +package winio + +//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go new file mode 100644 index 00000000..176ff75e --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go @@ -0,0 +1,427 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package winio + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return errERROR_EINVAL + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") + + procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") + procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") + procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") + procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") + procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") + procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") + procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") + procRevertToSelf = modadvapi32.NewProc("RevertToSelf") + procBackupRead = modkernel32.NewProc("BackupRead") + procBackupWrite = modkernel32.NewProc("BackupWrite") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") + procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") + procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") + procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procLocalAlloc = modkernel32.NewProc("LocalAlloc") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") + procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") + procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") + procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") + procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") + procbind = modws2_32.NewProc("bind") +) + +func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { + var _p0 uint32 + if releaseAll { + _p0 = 1 + } + r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) + success = r0 != 0 + if true { + err = errnoErr(e1) + } + return +} + +func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func convertSidToStringSid(sid *byte, str **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(str) + if err != nil { + return + } + return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) +} + +func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getSecurityDescriptorLength(sd uintptr) (len uint32) { + r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0) + len = uint32(r0) + return +} + +func impersonateSelf(level uint32) (err error) { + r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(accountName) + if err != nil { + return + } + return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) +} + +func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) +} + +func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeName(_p0, luid, buffer, size) +} + +func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + var _p1 *uint16 + _p1, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _lookupPrivilegeValue(_p0, _p1, luid) +} + +func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { + r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { + var _p0 uint32 + if openAsSelf { + _p0 = 1 + } + r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func revertToSelf() (err error) { + r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } + r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } + r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) +} + +func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + err = errnoErr(e1) + } + return +} + +func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) + newport = syscall.Handle(r0) + if newport == 0 { + err = errnoErr(e1) + } + return +} + +func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) +} + +func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + err = errnoErr(e1) + } + return +} + +func getCurrentThread() (h syscall.Handle) { + r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) + h = syscall.Handle(r0) + return +} + +func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { + r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0) + ptr = uintptr(r0) + return +} + +func localFree(mem uintptr) { + syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0) + return +} + +func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { + r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) + status = ntstatus(r0) + return +} + +func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) + status = ntstatus(r0) + return +} + +func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) + status = ntstatus(r0) + return +} + +func rtlNtStatusToDosError(status ntstatus) (winerr error) { + r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) + if r0 != 0 { + winerr = syscall.Errno(r0) + } + return +} + +func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } + r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socketError { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/alecthomas/kong/.gitignore b/vendor/github.com/alecthomas/kong/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/alecthomas/kong/.golangci.yml b/vendor/github.com/alecthomas/kong/.golangci.yml new file mode 100644 index 00000000..e8980bfc --- /dev/null +++ b/vendor/github.com/alecthomas/kong/.golangci.yml @@ -0,0 +1,89 @@ +run: + tests: true + +output: + print-issued-lines: false + +linters: + enable-all: true + disable: + - maligned + - lll + - gochecknoglobals + - wsl + - funlen + - gocognit + - gomnd + - goprintffuncname + - paralleltest + - nlreturn + - goerr113 + - ifshort + - testpackage + - wrapcheck + - exhaustivestruct + - forbidigo + - gci + - godot + - gofumpt + - cyclop + - errorlint + - nestif + - golint + - scopelint + - interfacer + - tagliatelle + - thelper + - godox + - goconst + - varnamelen + - ireturn + - exhaustruct + - nonamedreturns + - nilnil + - nosnakecase # deprecated since v1.48.1 + - structcheck # deprecated since v1.49.0 + - deadcode # deprecated since v1.49.0 + - varcheck # deprecated since v1.49.0 + - depguard # nothing to guard against yet + - tagalign # hurts readability of kong tags + +linters-settings: + govet: + check-shadowing: true + # These govet checks are disabled by default, but they're useful. + enable: + - niliness + - sortslice + - unusedwrite + dupl: + threshold: 100 + gocyclo: + min-complexity: 20 + exhaustive: + default-signifies-exhaustive: true + +issues: + max-per-linter: 0 + max-same: 0 + exclude-use-default: false + exclude: + - '^(G104|G204):' + # Very commonly not checked. + - 'Error return value of .(.*\.Help|.*\.MarkFlagRequired|(os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' + - 'exported method (.*\.MarshalJSON|.*\.UnmarshalJSON) should have comment or be unexported' + - 'composite literal uses unkeyed fields' + - 'bad syntax for struct tag key' + - 'bad syntax for struct tag pair' + - 'result .* \(error\) is always nil' + + exclude-rules: + # Don't warn on unused parameters. + # Parameter names are useful for documentation. + # Replacing them with '_' hides useful information. + - linters: [revive] + text: 'unused-parameter: parameter \S+ seems to be unused, consider removing or renaming it as _' + + # Duplicate words are okay in tests. + - linters: [dupword] + path: _test\.go diff --git a/vendor/github.com/alecthomas/kong/COPYING b/vendor/github.com/alecthomas/kong/COPYING new file mode 100644 index 00000000..22707acf --- /dev/null +++ b/vendor/github.com/alecthomas/kong/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2018 Alec Thomas + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/alecthomas/kong/README.md b/vendor/github.com/alecthomas/kong/README.md new file mode 100644 index 00000000..22e00f06 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/README.md @@ -0,0 +1,746 @@ + +

+ +# Kong is a command-line parser for Go + +[![](https://godoc.org/github.com/alecthomas/kong?status.svg)](http://godoc.org/github.com/alecthomas/kong) [![CircleCI](https://img.shields.io/circleci/project/github/alecthomas/kong.svg)](https://circleci.com/gh/alecthomas/kong) [![Go Report Card](https://goreportcard.com/badge/github.com/alecthomas/kong)](https://goreportcard.com/report/github.com/alecthomas/kong) [![Slack chat](https://img.shields.io/static/v1?logo=slack&style=flat&label=slack&color=green&message=gophers)](https://gophers.slack.com/messages/CN9DS8YF3) + + + +- [Introduction](#introduction) +- [Help](#help) + - [Help as a user of a Kong application](#help-as-a-user-of-a-kong-application) + - [Defining help in Kong](#defining-help-in-kong) +- [Command handling](#command-handling) + - [Switch on the command string](#switch-on-the-command-string) + - [Attach a Run... error method to each command](#attach-a-run-error-method-to-each-command) +- [Hooks: BeforeReset, BeforeResolve, BeforeApply, AfterApply and the Bind option](#hooks-beforereset-beforeresolve-beforeapply-afterapply-and-the-bind-option) +- [Flags](#flags) +- [Commands and sub-commands](#commands-and-sub-commands) +- [Branching positional arguments](#branching-positional-arguments) +- [Positional arguments](#positional-arguments) +- [Slices](#slices) +- [Maps](#maps) +- [Pointers](#pointers) +- [Nested data structure](#nested-data-structure) +- [Custom named decoders](#custom-named-decoders) +- [Supported field types](#supported-field-types) +- [Custom decoders mappers](#custom-decoders-mappers) +- [Supported tags](#supported-tags) +- [Plugins](#plugins) +- [Dynamic Commands](#dynamic-commands) +- [Variable interpolation](#variable-interpolation) +- [Validation](#validation) +- [Modifying Kong's behaviour](#modifying-kongs-behaviour) + - [Namehelp and Descriptionhelp - set the application name description](#namehelp-and-descriptionhelp---set-the-application-name-description) + - [Configurationloader, paths... - load defaults from configuration files](#configurationloader-paths---load-defaults-from-configuration-files) + - [Resolver... - support for default values from external sources](#resolver---support-for-default-values-from-external-sources) + - [\*Mapper... - customising how the command-line is mapped to Go values](#mapper---customising-how-the-command-line-is-mapped-to-go-values) + - [ConfigureHelpHelpOptions and HelpHelpFunc - customising help](#configurehelphelpoptions-and-helphelpfunc---customising-help) + - [Bind... - bind values for callback hooks and Run methods](#bind---bind-values-for-callback-hooks-and-run-methods) + - [Other options](#other-options) + + + +## Introduction + +Kong aims to support arbitrarily complex command-line structures with as little developer effort as possible. + +To achieve that, command-lines are expressed as Go types, with the structure and tags directing how the command line is mapped onto the struct. + +For example, the following command-line: + + shell rm [-f] [-r] ... + shell ls [ ...] + +Can be represented by the following command-line structure: + +```go +package main + +import "github.com/alecthomas/kong" + +var CLI struct { + Rm struct { + Force bool `help:"Force removal."` + Recursive bool `help:"Recursively remove files."` + + Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` + } `cmd:"" help:"Remove files."` + + Ls struct { + Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` + } `cmd:"" help:"List paths."` +} + +func main() { + ctx := kong.Parse(&CLI) + switch ctx.Command() { + case "rm ": + case "ls": + default: + panic(ctx.Command()) + } +} +``` + +## Help + +### Help as a user of a Kong application + +Every Kong application includes a `--help` flag that will display auto-generated help. + +eg. + + $ shell --help + usage: shell + + A shell-like example app. + + Flags: + --help Show context-sensitive help. + --debug Debug mode. + + Commands: + rm ... + Remove files. + + ls [ ...] + List paths. + +If a command is provided, the help will show full detail on the command including all available flags. + +eg. + + $ shell --help rm + usage: shell rm ... + + Remove files. + + Arguments: + ... Paths to remove. + + Flags: + --debug Debug mode. + + -f, --force Force removal. + -r, --recursive Recursively remove files. + +### Defining help in Kong + +Help is automatically generated from the command-line structure itself, +including `help:""` and other tags. [Variables](#variable-interpolation) will +also be interpolated into the help string. + +Finally, any command, or argument type implementing the interface +`Help() string` will have this function called to retrieve more detail to +augment the help tag. This allows for much more descriptive text than can +fit in Go tags. [See \_examples/shell/help](./_examples/shell/help) + +#### Showing the _command_'s detailed help + +A command's additional help text is _not_ shown from top-level help, but can be displayed within contextual help: + +**Top level help** + +```bash + $ go run ./_examples/shell/help --help +Usage: help + +An app demonstrating HelpProviders + +Flags: + -h, --help Show context-sensitive help. + --flag Regular flag help + +Commands: + echo Regular command help +``` + +**Contextual** + +```bash + $ go run ./_examples/shell/help echo --help +Usage: help echo + +Regular command help + +🚀 additional command help + +Arguments: + Regular argument help + +Flags: + -h, --help Show context-sensitive help. + --flag Regular flag help +``` + +#### Showing an _argument_'s detailed help + +Custom help will only be shown for _positional arguments with named fields_ ([see the README section on positional arguments for more details on what that means](../../../README.md#branching-positional-arguments)) + +**Contextual argument help** + +```bash + $ go run ./_examples/shell/help msg --help +Usage: help echo + +Regular argument help + +📣 additional argument help + +Flags: + -h, --help Show context-sensitive help. + --flag Regular flag help +``` + +## Command handling + +There are two ways to handle commands in Kong. + +### Switch on the command string + +When you call `kong.Parse()` it will return a unique string representation of the command. Each command branch in the hierarchy will be a bare word and each branching argument or required positional argument will be the name surrounded by angle brackets. Here's an example: + +There's an example of this pattern [here](https://github.com/alecthomas/kong/blob/master/_examples/shell/commandstring/main.go). + +eg. + +```go +package main + +import "github.com/alecthomas/kong" + +var CLI struct { + Rm struct { + Force bool `help:"Force removal."` + Recursive bool `help:"Recursively remove files."` + + Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` + } `cmd:"" help:"Remove files."` + + Ls struct { + Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` + } `cmd:"" help:"List paths."` +} + +func main() { + ctx := kong.Parse(&CLI) + switch ctx.Command() { + case "rm ": + case "ls": + default: + panic(ctx.Command()) + } +} +``` + +This has the advantage that it is convenient, but the downside that if you modify your CLI structure, the strings may change. This can be fragile. + +### Attach a `Run(...) error` method to each command + +A more robust approach is to break each command out into their own structs: + +1. Break leaf commands out into separate structs. +2. Attach a `Run(...) error` method to all leaf commands. +3. Call `kong.Kong.Parse()` to obtain a `kong.Context`. +4. Call `kong.Context.Run(bindings...)` to call the selected parsed command. + +Once a command node is selected by Kong it will search from that node back to the root. Each +encountered command node with a `Run(...) error` will be called in reverse order. This allows +sub-trees to be re-used fairly conveniently. + +In addition to values bound with the `kong.Bind(...)` option, any values +passed through to `kong.Context.Run(...)` are also bindable to the target's +`Run()` arguments. + +Finally, hooks can also contribute bindings via `kong.Context.Bind()` and `kong.Context.BindTo()`. + +There's a full example emulating part of the Docker CLI [here](https://github.com/alecthomas/kong/tree/master/_examples/docker). + +eg. + +```go +type Context struct { + Debug bool +} + +type RmCmd struct { + Force bool `help:"Force removal."` + Recursive bool `help:"Recursively remove files."` + + Paths []string `arg:"" name:"path" help:"Paths to remove." type:"path"` +} + +func (r *RmCmd) Run(ctx *Context) error { + fmt.Println("rm", r.Paths) + return nil +} + +type LsCmd struct { + Paths []string `arg:"" optional:"" name:"path" help:"Paths to list." type:"path"` +} + +func (l *LsCmd) Run(ctx *Context) error { + fmt.Println("ls", l.Paths) + return nil +} + +var cli struct { + Debug bool `help:"Enable debug mode."` + + Rm RmCmd `cmd:"" help:"Remove files."` + Ls LsCmd `cmd:"" help:"List paths."` +} + +func main() { + ctx := kong.Parse(&cli) + // Call the Run() method of the selected parsed command. + err := ctx.Run(&Context{Debug: cli.Debug}) + ctx.FatalIfErrorf(err) +} + +``` + +## Hooks: BeforeReset(), BeforeResolve(), BeforeApply(), AfterApply() and the Bind() option + +If a node in the grammar has a `BeforeReset(...)`, `BeforeResolve +(...)`, `BeforeApply(...) error` and/or `AfterApply(...) error` method, those +methods will be called before values are reset, before validation/assignment, +and after validation/assignment, respectively. + +The `--help` flag is implemented with a `BeforeReset` hook. + +Arguments to hooks are provided via the `Run(...)` method or `Bind(...)` option. `*Kong`, `*Context` and `*Path` are also bound and finally, hooks can also contribute bindings via `kong.Context.Bind()` and `kong.Context.BindTo()`. + +eg. + +```go +// A flag with a hook that, if triggered, will set the debug loggers output to stdout. +type debugFlag bool + +func (d debugFlag) BeforeApply(logger *log.Logger) error { + logger.SetOutput(os.Stdout) + return nil +} + +var cli struct { + Debug debugFlag `help:"Enable debug logging."` +} + +func main() { + // Debug logger going to discard. + logger := log.New(io.Discard, "", log.LstdFlags) + + ctx := kong.Parse(&cli, kong.Bind(logger)) + + // ... +} +``` + +Another example of using hooks is load the env-file: + +```go +package main + +import ( + "fmt" + "github.com/alecthomas/kong" + "github.com/joho/godotenv" +) + +type EnvFlag string + +// BeforeResolve loads env file. +func (c EnvFlag) BeforeReset(ctx *kong.Context, trace *kong.Path) error { + path := string(ctx.FlagValue(trace.Flag).(EnvFlag)) // nolint + path = kong.ExpandPath(path) + if err := godotenv.Load(path); err != nil { + return err + } + return nil +} + +var CLI struct { + EnvFile EnvFlag + Flag `env:"FLAG"` +} + +func main() { + _ = kong.Parse(&CLI) + fmt.Println(CLI.Flag) +} +``` + +## Flags + +Any [mapped](#mapper---customising-how-the-command-line-is-mapped-to-go-values) field in the command structure _not_ tagged with `cmd` or `arg` will be a flag. Flags are optional by default. + +eg. The command-line `app [--flag="foo"]` can be represented by the following. + +```go +type CLI struct { + Flag string +} +``` + +## Commands and sub-commands + +Sub-commands are specified by tagging a struct field with `cmd`. Kong supports arbitrarily nested commands. + +eg. The following struct represents the CLI structure `command [--flag="str"] sub-command`. + +```go +type CLI struct { + Command struct { + Flag string + + SubCommand struct { + } `cmd` + } `cmd` +} +``` + +If a sub-command is tagged with `default:"1"` it will be selected if there are no further arguments. If a sub-command is tagged with `default:"withargs"` it will be selected even if there are further arguments or flags and those arguments or flags are valid for the sub-command. This allows the user to omit the sub-command name on the CLI if its arguments/flags are not ambiguous with the sibling commands or flags. + +## Branching positional arguments + +In addition to sub-commands, structs can also be configured as branching positional arguments. + +This is achieved by tagging an [unmapped](#mapper---customising-how-the-command-line-is-mapped-to-go-values) nested struct field with `arg`, then including a positional argument field inside that struct _with the same name_. For example, the following command structure: + + app rename to + +Can be represented with the following: + +```go +var CLI struct { + Rename struct { + Name struct { + Name string `arg` // <-- NOTE: identical name to enclosing struct field. + To struct { + Name struct { + Name string `arg` + } `arg` + } `cmd` + } `arg` + } `cmd` +} +``` + +This looks a little verbose in this contrived example, but typically this will not be the case. + +## Positional arguments + +If a field is tagged with `arg:""` it will be treated as the final positional +value to be parsed on the command line. By default positional arguments are +required, but specifying `optional:""` will alter this. + +If a positional argument is a slice, all remaining arguments will be appended +to that slice. + +## Slices + +Slice values are treated specially. First the input is split on the `sep:""` tag (defaults to `,`), then each element is parsed by the slice element type and appended to the slice. If the same value is encountered multiple times, elements continue to be appended. + +To represent the following command-line: + + cmd ls ... + +You would use the following: + +```go +var CLI struct { + Ls struct { + Files []string `arg:"" type:"existingfile"` + } `cmd` +} +``` + +## Maps + +Maps are similar to slices except that only one key/value pair can be assigned per value, and the `sep` tag denotes the assignment character and defaults to `=`. + +To represent the following command-line: + + cmd config set = = ... + +You would use the following: + +```go +var CLI struct { + Config struct { + Set struct { + Config map[string]float64 `arg:"" type:"file:"` + } `cmd` + } `cmd` +} +``` + +For flags, multiple key+value pairs should be separated by `mapsep:"rune"` tag (defaults to `;`) eg. `--set="key1=value1;key2=value2"`. + +## Pointers + +Pointers work like the underlying type, except that you can differentiate between the presence of the zero value and no value being supplied. + +For example: + +```go +var CLI struct { + Foo *int +} +``` + +Would produce a nil value for `Foo` if no `--foo` argument is supplied, but would have a pointer to the value 0 if the argument `--foo=0` was supplied. + +## Nested data structure + +Kong support a nested data structure as well with `embed:""`. You can combine `embed:""` with `prefix:""`: + +```go +var CLI struct { + Logging struct { + Level string `enum:"debug,info,warn,error" default:"info"` + Type string `enum:"json,console" default:"console"` + } `embed:"" prefix:"logging."` +} +``` + +This configures Kong to accept flags `--logging.level` and `--logging.type`. + +## Custom named decoders + +Kong includes a number of builtin custom type mappers. These can be used by +specifying the tag `type:""`. They are registered with the option +function `NamedMapper(name, mapper)`. + +| Name | Description | +| -------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `path` | A path. ~ expansion is applied. `-` is accepted for stdout, and will be passed unaltered. | +| `existingfile` | An existing file. ~ expansion is applied. `-` is accepted for stdin, and will be passed unaltered. | +| `existingdir` | An existing directory. ~ expansion is applied. | +| `counter` | Increment a numeric field. Useful for `-vvv`. Can accept `-s`, `--long` or `--long=N`. | +| `filecontent` | Read the file at path into the field. ~ expansion is applied. `-` is accepted for stdin, and will be passed unaltered. | + +Slices and maps treat type tags specially. For slices, the `type:""` tag +specifies the element type. For maps, the tag has the format +`tag:"[]:[]"` where either may be omitted. + +## Supported field types + +## Custom decoders (mappers) + +Any field implementing `encoding.TextUnmarshaler` or `json.Unmarshaler` will use those interfaces +for decoding values. Kong also includes builtin support for many common Go types: + +| Type | Description | +| --------------- | ----------------------------------------------------------------------------------------------------------- | +| `time.Duration` | Populated using `time.ParseDuration()`. | +| `time.Time` | Populated using `time.Parse()`. Format defaults to RFC3339 but can be overridden with the `format:"X"` tag. | +| `*os.File` | Path to a file that will be opened, or `-` for `os.Stdin`. File must be closed by the user. | +| `*url.URL` | Populated with `url.Parse()`. | + +For more fine-grained control, if a field implements the +[MapperValue](https://godoc.org/github.com/alecthomas/kong#MapperValue) +interface it will be used to decode arguments into the field. + +## Supported tags + +Tags can be in two forms: + +1. Standard Go syntax, eg. `kong:"required,name='foo'"`. +2. Bare tags, eg. `required:"" name:"foo"` + +Both can coexist with standard Tag parsing. + +| Tag | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `cmd:""` | If present, struct is a command. | +| `arg:""` | If present, field is an argument. Required by default. | +| `env:"X,Y,..."` | Specify envars to use for default value. The envs are resolved in the declared order. The first value found is used. | +| `name:"X"` | Long name, for overriding field name. | +| `help:"X"` | Help text. | +| `type:"X"` | Specify [named types](#custom-named-decoders) to use. | +| `placeholder:"X"` | Placeholder text. | +| `default:"X"` | Default value. | +| `default:"1"` | On a command, make it the default. | +| `default:"withargs"` | On a command, make it the default and allow args/flags from that command | +| `short:"X"` | Short name, if flag. | +| `aliases:"X,Y"` | One or more aliases (for cmd or flag). | +| `required:""` | If present, flag/arg is required. | +| `optional:""` | If present, flag/arg is optional. | +| `hidden:""` | If present, command or flag is hidden. | +| `negatable:""` | If present on a `bool` field, supports prefixing a flag with `--no-` to invert the default value | +| `format:"X"` | Format for parsing input, if supported. | +| `sep:"X"` | Separator for sequences (defaults to ","). May be `none` to disable splitting. | +| `mapsep:"X"` | Separator for maps (defaults to ";"). May be `none` to disable splitting. | +| `enum:"X,Y,..."` | Set of valid values allowed for this flag. An enum field must be `required` or have a valid `default`. | +| `group:"X"` | Logical group for a flag or command. | +| `xor:"X,Y,..."` | Exclusive OR groups for flags. Only one flag in the group can be used which is restricted within the same command. When combined with `required`, at least one of the `xor` group will be required. | +| `prefix:"X"` | Prefix for all sub-flags. | +| `envprefix:"X"` | Envar prefix for all sub-flags. | +| `set:"K=V"` | Set a variable for expansion by child elements. Multiples can occur. | +| `embed:""` | If present, this field's children will be embedded in the parent. Useful for composition. | +| `passthrough:""` | If present on a positional argument, it stops flag parsing when encountered, as if `--` was processed before. Useful for external command wrappers, like `exec`. On a command it requires that the command contains only one argument of type `[]string` which is then filled with everything following the command, unparsed. | +| `-` | Ignore the field. Useful for adding non-CLI fields to a configuration struct. e.g `` `kong:"-"` `` | + +## Plugins + +Kong CLI's can be extended by embedding the `kong.Plugin` type and populating it with pointers to Kong annotated structs. For example: + +```go +var pluginOne struct { + PluginOneFlag string +} +var pluginTwo struct { + PluginTwoFlag string +} +var cli struct { + BaseFlag string + kong.Plugins +} +cli.Plugins = kong.Plugins{&pluginOne, &pluginTwo} +``` + +Additionally if an interface type is embedded, it can also be populated with a Kong annotated struct. + +## Dynamic Commands + +While plugins give complete control over extending command-line interfaces, Kong +also supports dynamically adding commands via `kong.DynamicCommand()`. + +## Variable interpolation + +Kong supports limited variable interpolation into help strings, enum lists and +default values. + +Variables are in the form: + + ${} + ${=} + +Variables are set with the `Vars{"key": "value", ...}` option. Undefined +variable references in the grammar without a default will result in an error at +construction time. + +Variables can also be set via the `set:"K=V"` tag. In this case, those variables will be available for that +node and all children. This is useful for composition by allowing the same struct to be reused. + +When interpolating into flag or argument help strings, some extra variables +are defined from the value itself: + + ${default} + ${enum} + +For flags with associated environment variables, the variable `${env}` can be +interpolated into the help string. In the absence of this variable in the +help string, Kong will append `($$${env})` to the help string. + +eg. + +```go +type cli struct { + Config string `type:"path" default:"${config_file}"` +} + +func main() { + kong.Parse(&cli, + kong.Vars{ + "config_file": "~/.app.conf", + }) +} +``` + +## Validation + +Kong does validation on the structure of a command-line, but also supports +extensible validation. Any node in the tree may implement the following +interface: + +```go +type Validatable interface { + Validate() error + } +``` + +If one of these nodes is in the active command-line it will be called during +normal validation. + +## Modifying Kong's behaviour + +Each Kong parser can be configured via functional options passed to `New(cli interface{}, options...Option)`. + +The full set of options can be found [here](https://godoc.org/github.com/alecthomas/kong#Option). + +### `Name(help)` and `Description(help)` - set the application name description + +Set the application name and/or description. + +The name of the application will default to the binary name, but can be overridden with `Name(name)`. + +As with all help in Kong, text will be wrapped to the terminal. + +### `Configuration(loader, paths...)` - load defaults from configuration files + +This option provides Kong with support for loading defaults from a set of configuration files. Each file is opened, if possible, and the loader called to create a resolver for that file. + +eg. + +```go +kong.Parse(&cli, kong.Configuration(kong.JSON, "/etc/myapp.json", "~/.myapp.json")) +``` + +[See the tests](https://github.com/alecthomas/kong/blob/master/resolver_test.go#L206) for an example of how the JSON file is structured. + +#### List of Configuration Loaders + +- [YAML](https://github.com/alecthomas/kong-yaml) +- [HCL](https://github.com/alecthomas/kong-hcl) +- [TOML](https://github.com/alecthomas/kong-toml) +- [JSON](https://github.com/alecthomas/kong) + +### `Resolver(...)` - support for default values from external sources + +Resolvers are Kong's extension point for providing default values from external sources. As an example, support for environment variables via the `env` tag is provided by a resolver. There's also a builtin resolver for JSON configuration files. + +Example resolvers can be found in [resolver.go](https://github.com/alecthomas/kong/blob/master/resolver.go). + +### `*Mapper(...)` - customising how the command-line is mapped to Go values + +Command-line arguments are mapped to Go values via the Mapper interface: + +```go +// A Mapper represents how a field is mapped from command-line values to Go. +// +// Mappers can be associated with concrete fields via pointer, reflect.Type, reflect.Kind, or via a "type" tag. +// +// Additionally, if a type implements the MapperValue interface, it will be used. +type Mapper interface { + // Decode ctx.Value with ctx.Scanner into target. + Decode(ctx *DecodeContext, target reflect.Value) error +} +``` + +All builtin Go types (as well as a bunch of useful stdlib types like `time.Time`) have mappers registered by default. Mappers for custom types can be added using `kong.??Mapper(...)` options. Mappers are applied to fields in four ways: + +1. `NamedMapper(string, Mapper)` and using the tag key `type:""`. +2. `KindMapper(reflect.Kind, Mapper)`. +3. `TypeMapper(reflect.Type, Mapper)`. +4. `ValueMapper(interface{}, Mapper)`, passing in a pointer to a field of the grammar. + +### `ConfigureHelp(HelpOptions)` and `Help(HelpFunc)` - customising help + +The default help output is usually sufficient, but if not there are two solutions. + +1. Use `ConfigureHelp(HelpOptions)` to configure how help is formatted (see [HelpOptions](https://godoc.org/github.com/alecthomas/kong#HelpOptions) for details). +2. Custom help can be wired into Kong via the `Help(HelpFunc)` option. The `HelpFunc` is passed a `Context`, which contains the parsed context for the current command-line. See the implementation of `PrintHelp` for an example. +3. Use `ValueFormatter(HelpValueFormatter)` if you want to just customize the help text that is accompanied by flags and arguments. +4. Use `Groups([]Group)` if you want to customize group titles or add a header. + +### `Bind(...)` - bind values for callback hooks and Run() methods + +See the [section on hooks](#hooks-beforeresolve-beforeapply-afterapply-and-the-bind-option) for details. + +### Other options + +The full set of options can be found [here](https://godoc.org/github.com/alecthomas/kong#Option). diff --git a/vendor/github.com/alecthomas/kong/build.go b/vendor/github.com/alecthomas/kong/build.go new file mode 100644 index 00000000..a52d90fa --- /dev/null +++ b/vendor/github.com/alecthomas/kong/build.go @@ -0,0 +1,360 @@ +package kong + +import ( + "fmt" + "reflect" + "strings" +) + +// Plugins are dynamically embedded command-line structures. +// +// Each element in the Plugins list *must* be a pointer to a structure. +type Plugins []interface{} + +func build(k *Kong, ast interface{}) (app *Application, err error) { + v := reflect.ValueOf(ast) + iv := reflect.Indirect(v) + if v.Kind() != reflect.Ptr || iv.Kind() != reflect.Struct { + return nil, fmt.Errorf("expected a pointer to a struct but got %T", ast) + } + + app = &Application{} + extraFlags := k.extraFlags() + seenFlags := map[string]bool{} + for _, flag := range extraFlags { + seenFlags[flag.Name] = true + } + + node, err := buildNode(k, iv, ApplicationNode, newEmptyTag(), seenFlags) + if err != nil { + return nil, err + } + if len(node.Positional) > 0 && len(node.Children) > 0 { + return nil, fmt.Errorf("can't mix positional arguments and branching arguments on %T", ast) + } + app.Node = node + app.Node.Flags = append(extraFlags, app.Node.Flags...) + app.Tag = newEmptyTag() + app.Tag.Vars = k.vars + return app, nil +} + +func dashedString(s string) string { + return strings.Join(camelCase(s), "-") +} + +type flattenedField struct { + field reflect.StructField + value reflect.Value + tag *Tag +} + +func flattenedFields(v reflect.Value, ptag *Tag) (out []flattenedField, err error) { + v = reflect.Indirect(v) + for i := 0; i < v.NumField(); i++ { + ft := v.Type().Field(i) + fv := v.Field(i) + tag, err := parseTag(v, ft) + if err != nil { + return nil, err + } + if tag.Ignored { + continue + } + // Assign group if it's not already set. + if tag.Group == "" { + tag.Group = ptag.Group + } + // Accumulate prefixes. + tag.Prefix = ptag.Prefix + tag.Prefix + tag.EnvPrefix = ptag.EnvPrefix + tag.EnvPrefix + // Combine parent vars. + tag.Vars = ptag.Vars.CloneWith(tag.Vars) + // Command and embedded structs can be pointers, so we hydrate them now. + if (tag.Cmd || tag.Embed) && ft.Type.Kind() == reflect.Ptr { + fv = reflect.New(ft.Type.Elem()).Elem() + v.FieldByIndex(ft.Index).Set(fv.Addr()) + } + if !ft.Anonymous && !tag.Embed { + if fv.CanSet() { + field := flattenedField{field: ft, value: fv, tag: tag} + out = append(out, field) + } + continue + } + + // Embedded type. + if fv.Kind() == reflect.Interface { + fv = fv.Elem() + } else if fv.Type() == reflect.TypeOf(Plugins{}) { + for i := 0; i < fv.Len(); i++ { + fields, ferr := flattenedFields(fv.Index(i).Elem(), tag) + if ferr != nil { + return nil, ferr + } + out = append(out, fields...) + } + continue + } + sub, err := flattenedFields(fv, tag) + if err != nil { + return nil, err + } + out = append(out, sub...) + } + return out, nil +} + +// Build a Node in the Kong data model. +// +// "v" is the value to create the node from, "typ" is the output Node type. +func buildNode(k *Kong, v reflect.Value, typ NodeType, tag *Tag, seenFlags map[string]bool) (*Node, error) { + node := &Node{ + Type: typ, + Target: v, + Tag: tag, + } + fields, err := flattenedFields(v, tag) + if err != nil { + return nil, err + } + +MAIN: + for _, field := range fields { + for _, r := range k.ignoreFields { + if r.MatchString(v.Type().Name() + "." + field.field.Name) { + continue MAIN + } + } + + ft := field.field + fv := field.value + + tag := field.tag + name := tag.Name + if name == "" { + name = tag.Prefix + k.flagNamer(ft.Name) + } else { + name = tag.Prefix + name + } + + if len(tag.Envs) != 0 { + for i := range tag.Envs { + tag.Envs[i] = tag.EnvPrefix + tag.Envs[i] + } + } + + // Nested structs are either commands or args, unless they implement the Mapper interface. + if field.value.Kind() == reflect.Struct && (tag.Cmd || tag.Arg) && k.registry.ForValue(fv) == nil { + typ := CommandNode + if tag.Arg { + typ = ArgumentNode + } + err = buildChild(k, node, typ, v, ft, fv, tag, name, seenFlags) + } else { + err = buildField(k, node, v, ft, fv, tag, name, seenFlags) + } + if err != nil { + return nil, err + } + } + + // Validate if there are no duplicate names + if err := checkDuplicateNames(node, v); err != nil { + return nil, err + } + + // "Unsee" flags. + for _, flag := range node.Flags { + delete(seenFlags, "--"+flag.Name) + if flag.Short != 0 { + delete(seenFlags, "-"+string(flag.Short)) + } + } + + if err := validatePositionalArguments(node); err != nil { + return nil, err + } + + return node, nil +} + +func validatePositionalArguments(node *Node) error { + var last *Value + for i, curr := range node.Positional { + if last != nil { + // Scan through argument positionals to ensure optional is never before a required. + if !last.Required && curr.Required { + return fmt.Errorf("%s: required %q cannot come after optional %q", node.FullPath(), curr.Name, last.Name) + } + + // Cumulative argument needs to be last. + if last.IsCumulative() { + return fmt.Errorf("%s: argument %q cannot come after cumulative %q", node.FullPath(), curr.Name, last.Name) + } + } + + last = curr + curr.Position = i + } + + return nil +} + +func buildChild(k *Kong, node *Node, typ NodeType, v reflect.Value, ft reflect.StructField, fv reflect.Value, tag *Tag, name string, seenFlags map[string]bool) error { + child, err := buildNode(k, fv, typ, newEmptyTag(), seenFlags) + if err != nil { + return err + } + child.Name = name + child.Tag = tag + child.Parent = node + child.Help = tag.Help + child.Hidden = tag.Hidden + child.Group = buildGroupForKey(k, tag.Group) + child.Aliases = tag.Aliases + + if provider, ok := fv.Addr().Interface().(HelpProvider); ok { + child.Detail = provider.Help() + } + + // A branching argument. This is a bit hairy, as we let buildNode() do the parsing, then check that + // a positional argument is provided to the child, and move it to the branching argument field. + if tag.Arg { + if len(child.Positional) == 0 { + return failField(v, ft, "positional branch must have at least one child positional argument named %q", name) + } + if child.Positional[0].Name != name { + return failField(v, ft, "first field in positional branch must have the same name as the parent field (%s).", child.Name) + } + + child.Argument = child.Positional[0] + child.Positional = child.Positional[1:] + if child.Help == "" { + child.Help = child.Argument.Help + } + } else { + if tag.HasDefault { + if node.DefaultCmd != nil { + return failField(v, ft, "can't have more than one default command under %s", node.Summary()) + } + if tag.Default != "withargs" && (len(child.Children) > 0 || len(child.Positional) > 0) { + return failField(v, ft, "default command %s must not have subcommands or arguments", child.Summary()) + } + node.DefaultCmd = child + } + if tag.Passthrough { + if len(child.Children) > 0 || len(child.Flags) > 0 { + return failField(v, ft, "passthrough command %s must not have subcommands or flags", child.Summary()) + } + if len(child.Positional) != 1 { + return failField(v, ft, "passthrough command %s must contain exactly one positional argument", child.Summary()) + } + if !checkPassthroughArg(child.Positional[0].Target) { + return failField(v, ft, "passthrough command %s must contain exactly one positional argument of []string type", child.Summary()) + } + child.Passthrough = true + } + } + node.Children = append(node.Children, child) + + if len(child.Positional) > 0 && len(child.Children) > 0 { + return failField(v, ft, "can't mix positional arguments and branching arguments") + } + + return nil +} + +func buildField(k *Kong, node *Node, v reflect.Value, ft reflect.StructField, fv reflect.Value, tag *Tag, name string, seenFlags map[string]bool) error { + mapper := k.registry.ForNamedValue(tag.Type, fv) + if mapper == nil { + return failField(v, ft, "unsupported field type %s, perhaps missing a cmd:\"\" tag?", ft.Type) + } + + value := &Value{ + Name: name, + Help: tag.Help, + OrigHelp: tag.Help, + HasDefault: tag.HasDefault, + Default: tag.Default, + DefaultValue: reflect.New(fv.Type()).Elem(), + Mapper: mapper, + Tag: tag, + Target: fv, + Enum: tag.Enum, + Passthrough: tag.Passthrough, + + // Flags are optional by default, and args are required by default. + Required: (!tag.Arg && tag.Required) || (tag.Arg && !tag.Optional), + Format: tag.Format, + } + + if tag.Arg { + node.Positional = append(node.Positional, value) + } else { + if seenFlags["--"+value.Name] { + return failField(v, ft, "duplicate flag --%s", value.Name) + } + seenFlags["--"+value.Name] = true + for _, alias := range tag.Aliases { + aliasFlag := "--" + alias + if seenFlags[aliasFlag] { + return failField(v, ft, "duplicate flag %s", aliasFlag) + } + seenFlags[aliasFlag] = true + } + if tag.Short != 0 { + if seenFlags["-"+string(tag.Short)] { + return failField(v, ft, "duplicate short flag -%c", tag.Short) + } + seenFlags["-"+string(tag.Short)] = true + } + flag := &Flag{ + Value: value, + Aliases: tag.Aliases, + Short: tag.Short, + PlaceHolder: tag.PlaceHolder, + Envs: tag.Envs, + Group: buildGroupForKey(k, tag.Group), + Xor: tag.Xor, + Hidden: tag.Hidden, + } + value.Flag = flag + node.Flags = append(node.Flags, flag) + } + return nil +} + +func buildGroupForKey(k *Kong, key string) *Group { + if key == "" { + return nil + } + for _, group := range k.groups { + if group.Key == key { + return &group + } + } + + // No group provided with kong.ExplicitGroups. We create one ad-hoc for this key. + return &Group{ + Key: key, + Title: key, + } +} + +func checkDuplicateNames(node *Node, v reflect.Value) error { + seenNames := make(map[string]struct{}) + for _, node := range node.Children { + if _, ok := seenNames[node.Name]; ok { + name := v.Type().Name() + if name == "" { + name = "" + } + return fmt.Errorf("duplicate command name %q in command %q", node.Name, name) + } + + seenNames[node.Name] = struct{}{} + } + + return nil +} diff --git a/vendor/github.com/alecthomas/kong/callbacks.go b/vendor/github.com/alecthomas/kong/callbacks.go new file mode 100644 index 00000000..45ef0d25 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/callbacks.go @@ -0,0 +1,129 @@ +package kong + +import ( + "fmt" + "reflect" + "strings" +) + +type bindings map[reflect.Type]func() (reflect.Value, error) + +func (b bindings) String() string { + out := []string{} + for k := range b { + out = append(out, k.String()) + } + return "bindings{" + strings.Join(out, ", ") + "}" +} + +func (b bindings) add(values ...interface{}) bindings { + for _, v := range values { + v := v + b[reflect.TypeOf(v)] = func() (reflect.Value, error) { return reflect.ValueOf(v), nil } + } + return b +} + +func (b bindings) addTo(impl, iface interface{}) { + valueOf := reflect.ValueOf(impl) + b[reflect.TypeOf(iface).Elem()] = func() (reflect.Value, error) { return valueOf, nil } +} + +func (b bindings) addProvider(provider interface{}) error { + pv := reflect.ValueOf(provider) + t := pv.Type() + if t.Kind() != reflect.Func || t.NumIn() != 0 || t.NumOut() != 2 || t.Out(1) != reflect.TypeOf((*error)(nil)).Elem() { + return fmt.Errorf("%T must be a function with the signature func()(T, error)", provider) + } + rt := pv.Type().Out(0) + b[rt] = func() (reflect.Value, error) { + out := pv.Call(nil) + errv := out[1] + var err error + if !errv.IsNil() { + err = errv.Interface().(error) //nolint + } + return out[0], err + } + return nil +} + +// Clone and add values. +func (b bindings) clone() bindings { + out := make(bindings, len(b)) + for k, v := range b { + out[k] = v + } + return out +} + +func (b bindings) merge(other bindings) bindings { + for k, v := range other { + b[k] = v + } + return b +} + +func getMethod(value reflect.Value, name string) reflect.Value { + method := value.MethodByName(name) + if !method.IsValid() { + if value.CanAddr() { + method = value.Addr().MethodByName(name) + } + } + return method +} + +func callFunction(f reflect.Value, bindings bindings) error { + if f.Kind() != reflect.Func { + return fmt.Errorf("expected function, got %s", f.Type()) + } + in := []reflect.Value{} + t := f.Type() + if t.NumOut() != 1 || !t.Out(0).Implements(callbackReturnSignature) { + return fmt.Errorf("return value of %s must implement \"error\"", t) + } + for i := 0; i < t.NumIn(); i++ { + pt := t.In(i) + if argf, ok := bindings[pt]; ok { + argv, err := argf() + if err != nil { + return err + } + in = append(in, argv) + } else { + return fmt.Errorf("couldn't find binding of type %s for parameter %d of %s(), use kong.Bind(%s)", pt, i, t, pt) + } + } + out := f.Call(in) + if out[0].IsNil() { + return nil + } + return out[0].Interface().(error) //nolint +} + +func callAnyFunction(f reflect.Value, bindings bindings) (out []any, err error) { + if f.Kind() != reflect.Func { + return nil, fmt.Errorf("expected function, got %s", f.Type()) + } + in := []reflect.Value{} + t := f.Type() + for i := 0; i < t.NumIn(); i++ { + pt := t.In(i) + if argf, ok := bindings[pt]; ok { + argv, err := argf() + if err != nil { + return nil, err + } + in = append(in, argv) + } else { + return nil, fmt.Errorf("couldn't find binding of type %s for parameter %d of %s(), use kong.Bind(%s)", pt, i, t, pt) + } + } + outv := f.Call(in) + out = make([]any, len(outv)) + for i, v := range outv { + out[i] = v.Interface() + } + return out, nil +} diff --git a/vendor/github.com/alecthomas/kong/camelcase.go b/vendor/github.com/alecthomas/kong/camelcase.go new file mode 100644 index 00000000..a955b16b --- /dev/null +++ b/vendor/github.com/alecthomas/kong/camelcase.go @@ -0,0 +1,90 @@ +package kong + +// NOTE: This code is from https://github.com/fatih/camelcase. MIT license. + +import ( + "unicode" + "unicode/utf8" +) + +// Split splits the camelcase word and returns a list of words. It also +// supports digits. Both lower camel case and upper camel case are supported. +// For more info please check: http://en.wikipedia.org/wiki/CamelCase +// +// Examples +// +// "" => [""] +// "lowercase" => ["lowercase"] +// "Class" => ["Class"] +// "MyClass" => ["My", "Class"] +// "MyC" => ["My", "C"] +// "HTML" => ["HTML"] +// "PDFLoader" => ["PDF", "Loader"] +// "AString" => ["A", "String"] +// "SimpleXMLParser" => ["Simple", "XML", "Parser"] +// "vimRPCPlugin" => ["vim", "RPC", "Plugin"] +// "GL11Version" => ["GL", "11", "Version"] +// "99Bottles" => ["99", "Bottles"] +// "May5" => ["May", "5"] +// "BFG9000" => ["BFG", "9000"] +// "BöseÜberraschung" => ["Böse", "Überraschung"] +// "Two spaces" => ["Two", " ", "spaces"] +// "BadUTF8\xe2\xe2\xa1" => ["BadUTF8\xe2\xe2\xa1"] +// +// Splitting rules +// +// 1. If string is not valid UTF-8, return it without splitting as +// single item array. +// 2. Assign all unicode characters into one of 4 sets: lower case +// letters, upper case letters, numbers, and all other characters. +// 3. Iterate through characters of string, introducing splits +// between adjacent characters that belong to different sets. +// 4. Iterate through array of split strings, and if a given string +// is upper case: +// if subsequent string is lower case: +// move last character of upper case string to beginning of +// lower case string +func camelCase(src string) (entries []string) { + // don't split invalid utf8 + if !utf8.ValidString(src) { + return []string{src} + } + entries = []string{} + var runes [][]rune + lastClass := 0 + // split into fields based on class of unicode character + for _, r := range src { + var class int + switch { + case unicode.IsLower(r): + class = 1 + case unicode.IsUpper(r): + class = 2 + case unicode.IsDigit(r): + class = 3 + default: + class = 4 + } + if class == lastClass { + runes[len(runes)-1] = append(runes[len(runes)-1], r) + } else { + runes = append(runes, []rune{r}) + } + lastClass = class + } + // handle upper case -> lower case sequences, e.g. + // "PDFL", "oader" -> "PDF", "Loader" + for i := 0; i < len(runes)-1; i++ { + if unicode.IsUpper(runes[i][0]) && unicode.IsLower(runes[i+1][0]) { + runes[i+1] = append([]rune{runes[i][len(runes[i])-1]}, runes[i+1]...) + runes[i] = runes[i][:len(runes[i])-1] + } + } + // construct []string from results + for _, s := range runes { + if len(s) > 0 { + entries = append(entries, string(s)) + } + } + return entries +} diff --git a/vendor/github.com/alecthomas/kong/context.go b/vendor/github.com/alecthomas/kong/context.go new file mode 100644 index 00000000..b2bfea69 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/context.go @@ -0,0 +1,1019 @@ +package kong + +import ( + "errors" + "fmt" + "os" + "reflect" + "sort" + "strconv" + "strings" +) + +// Path records the nodes and parsed values from the current command-line. +type Path struct { + Parent *Node + + // One of these will be non-nil. + App *Application + Positional *Positional + Flag *Flag + Argument *Argument + Command *Command + + // Flags added by this node. + Flags []*Flag + + // True if this Path element was created as the result of a resolver. + Resolved bool +} + +// Node returns the Node associated with this Path, or nil if Path is a non-Node. +func (p *Path) Node() *Node { + switch { + case p.App != nil: + return p.App.Node + + case p.Argument != nil: + return p.Argument + + case p.Command != nil: + return p.Command + } + return nil +} + +// Visitable returns the Visitable for this path element. +func (p *Path) Visitable() Visitable { + switch { + case p.App != nil: + return p.App + + case p.Argument != nil: + return p.Argument + + case p.Command != nil: + return p.Command + + case p.Flag != nil: + return p.Flag + + case p.Positional != nil: + return p.Positional + } + return nil +} + +// Context contains the current parse context. +type Context struct { + *Kong + // A trace through parsed nodes. + Path []*Path + // Original command-line arguments. + Args []string + // Error that occurred during trace, if any. + Error error + + values map[*Value]reflect.Value // Temporary values during tracing. + bindings bindings + resolvers []Resolver // Extra context-specific resolvers. + scan *Scanner +} + +// Trace path of "args" through the grammar tree. +// +// The returned Context will include a Path of all commands, arguments, positionals and flags. +// +// This just constructs a new trace. To fully apply the trace you must call Reset(), Resolve(), +// Validate() and Apply(). +func Trace(k *Kong, args []string) (*Context, error) { + c := &Context{ + Kong: k, + Args: args, + Path: []*Path{ + {App: k.Model, Flags: k.Model.Flags}, + }, + values: map[*Value]reflect.Value{}, + scan: Scan(args...), + bindings: bindings{}, + } + c.Error = c.trace(c.Model.Node) + return c, nil +} + +// Bind adds bindings to the Context. +func (c *Context) Bind(args ...interface{}) { + c.bindings.add(args...) +} + +// BindTo adds a binding to the Context. +// +// This will typically have to be called like so: +// +// BindTo(impl, (*MyInterface)(nil)) +func (c *Context) BindTo(impl, iface interface{}) { + c.bindings.addTo(impl, iface) +} + +// BindToProvider allows binding of provider functions. +// +// This is useful when the Run() function of different commands require different values that may +// not all be initialisable from the main() function. +func (c *Context) BindToProvider(provider interface{}) error { + return c.bindings.addProvider(provider) +} + +// Value returns the value for a particular path element. +func (c *Context) Value(path *Path) reflect.Value { + switch { + case path.Positional != nil: + return c.values[path.Positional] + case path.Flag != nil: + return c.values[path.Flag.Value] + case path.Argument != nil: + return c.values[path.Argument.Argument] + } + panic("can only retrieve value for flag, argument or positional") +} + +// Selected command or argument. +func (c *Context) Selected() *Node { + var selected *Node + for _, path := range c.Path { + switch { + case path.Command != nil: + selected = path.Command + case path.Argument != nil: + selected = path.Argument + } + } + return selected +} + +// Empty returns true if there were no arguments provided. +func (c *Context) Empty() bool { + for _, path := range c.Path { + if !path.Resolved && path.App == nil { + return false + } + } + return true +} + +// Validate the current context. +func (c *Context) Validate() error { //nolint: gocyclo + err := Visit(c.Model, func(node Visitable, next Next) error { + switch node := node.(type) { + case *Value: + ok := atLeastOneEnvSet(node.Tag.Envs) + if node.Enum != "" && (!node.Required || node.HasDefault || (len(node.Tag.Envs) != 0 && ok)) { + if err := checkEnum(node, node.Target); err != nil { + return err + } + } + + case *Flag: + ok := atLeastOneEnvSet(node.Tag.Envs) + if node.Enum != "" && (!node.Required || node.HasDefault || (len(node.Tag.Envs) != 0 && ok)) { + if err := checkEnum(node.Value, node.Target); err != nil { + return err + } + } + } + return next(nil) + }) + if err != nil { + return err + } + for _, el := range c.Path { + var ( + value reflect.Value + desc string + ) + switch node := el.Visitable().(type) { + case *Value: + value = node.Target + desc = node.ShortSummary() + + case *Flag: + value = node.Target + desc = node.ShortSummary() + + case *Application: + value = node.Target + desc = "" + + case *Node: + value = node.Target + desc = node.Path() + } + if validate := isValidatable(value); validate != nil { + if err := validate.Validate(); err != nil { + if desc != "" { + return fmt.Errorf("%s: %w", desc, err) + } + return err + } + } + } + for _, resolver := range c.combineResolvers() { + if err := resolver.Validate(c.Model); err != nil { + return err + } + } + for _, path := range c.Path { + var value *Value + switch { + case path.Flag != nil: + value = path.Flag.Value + + case path.Positional != nil: + value = path.Positional + } + if value != nil && value.Tag.Enum != "" { + if err := checkEnum(value, value.Target); err != nil { + return err + } + } + if err := checkMissingFlags(path.Flags); err != nil { + return err + } + } + // Check the terminal node. + node := c.Selected() + if node == nil { + node = c.Model.Node + } + + // Find deepest positional argument so we can check if all required positionals have been provided. + positionals := 0 + for _, path := range c.Path { + if path.Positional != nil { + positionals = path.Positional.Position + 1 + } + } + + if err := checkMissingChildren(node); err != nil { + return err + } + if err := checkMissingPositionals(positionals, node.Positional); err != nil { + return err + } + if err := checkXorDuplicates(c.Path); err != nil { + return err + } + + if node.Type == ArgumentNode { + value := node.Argument + if value.Required && !value.Set { + return fmt.Errorf("%s is required", node.Summary()) + } + } + return nil +} + +// Flags returns the accumulated available flags. +func (c *Context) Flags() (flags []*Flag) { + for _, trace := range c.Path { + flags = append(flags, trace.Flags...) + } + return +} + +// Command returns the full command path. +func (c *Context) Command() string { + command := []string{} + for _, trace := range c.Path { + switch { + case trace.Positional != nil: + command = append(command, "<"+trace.Positional.Name+">") + + case trace.Argument != nil: + command = append(command, "<"+trace.Argument.Name+">") + + case trace.Command != nil: + command = append(command, trace.Command.Name) + } + } + return strings.Join(command, " ") +} + +// AddResolver adds a context-specific resolver. +// +// This is most useful in the BeforeResolve() hook. +func (c *Context) AddResolver(resolver Resolver) { + c.resolvers = append(c.resolvers, resolver) +} + +// FlagValue returns the set value of a flag if it was encountered and exists, or its default value. +func (c *Context) FlagValue(flag *Flag) interface{} { + for _, trace := range c.Path { + if trace.Flag == flag { + v, ok := c.values[trace.Flag.Value] + if !ok { + break + } + return v.Interface() + } + } + if flag.Target.IsValid() { + return flag.Target.Interface() + } + return flag.DefaultValue.Interface() +} + +// Reset recursively resets values to defaults (as specified in the grammar) or the zero value. +func (c *Context) Reset() error { + return Visit(c.Model.Node, func(node Visitable, next Next) error { + if value, ok := node.(*Value); ok { + return next(value.Reset()) + } + return next(nil) + }) +} + +func (c *Context) endParsing() { + args := []string{} + for { + token := c.scan.Pop() + if token.Type == EOLToken { + break + } + args = append(args, token.String()) + } + // Note: tokens must be pushed in reverse order. + for i := range args { + c.scan.PushTyped(args[len(args)-1-i], PositionalArgumentToken) + } +} + +func (c *Context) trace(node *Node) (err error) { //nolint: gocyclo + positional := 0 + node.Active = true + + flags := []*Flag{} + flagNode := node + if node.DefaultCmd != nil && node.DefaultCmd.Tag.Default == "withargs" { + // Add flags of the default command if the current node has one + // and that default command allows args / flags without explicitly + // naming the command on the CLI. + flagNode = node.DefaultCmd + } + for _, group := range flagNode.AllFlags(false) { + flags = append(flags, group...) + } + + if node.Passthrough { + c.endParsing() + } + + for !c.scan.Peek().IsEOL() { + token := c.scan.Peek() + switch token.Type { + case UntypedToken: + switch v := token.Value.(type) { + case string: + + switch { + case v == "-": + fallthrough + default: //nolint + c.scan.Pop() + c.scan.PushTyped(token.Value, PositionalArgumentToken) + + // Indicates end of parsing. All remaining arguments are treated as positional arguments only. + case v == "--": + c.scan.Pop() + c.endParsing() + + // Long flag. + case strings.HasPrefix(v, "--"): + c.scan.Pop() + // Parse it and push the tokens. + parts := strings.SplitN(v[2:], "=", 2) + if len(parts) > 1 { + c.scan.PushTyped(parts[1], FlagValueToken) + } + c.scan.PushTyped(parts[0], FlagToken) + + // Short flag. + case strings.HasPrefix(v, "-"): + c.scan.Pop() + // Note: tokens must be pushed in reverse order. + if tail := v[2:]; tail != "" { + c.scan.PushTyped(tail, ShortFlagTailToken) + } + c.scan.PushTyped(v[1:2], ShortFlagToken) + } + default: + c.scan.Pop() + c.scan.PushTyped(token.Value, PositionalArgumentToken) + } + + case ShortFlagTailToken: + c.scan.Pop() + // Note: tokens must be pushed in reverse order. + if tail := token.String()[1:]; tail != "" { + c.scan.PushTyped(tail, ShortFlagTailToken) + } + c.scan.PushTyped(token.String()[0:1], ShortFlagToken) + + case FlagToken: + if err := c.parseFlag(flags, token.String()); err != nil { + return err + } + + case ShortFlagToken: + if err := c.parseFlag(flags, token.String()); err != nil { + return err + } + + case FlagValueToken: + return fmt.Errorf("unexpected flag argument %q", token.Value) + + case PositionalArgumentToken: + candidates := []string{} + + // Ensure we've consumed all positional arguments. + if positional < len(node.Positional) { + arg := node.Positional[positional] + + if arg.Passthrough { + c.endParsing() + } + + arg.Active = true + err := arg.Parse(c.scan, c.getValue(arg)) + if err != nil { + return err + } + c.Path = append(c.Path, &Path{ + Parent: node, + Positional: arg, + }) + positional++ + break + } + + // Assign token value to a branch name if tagged as an alias + // An alias will be ignored in the case of an existing command + cmds := make(map[string]bool) + for _, branch := range node.Children { + if branch.Type == CommandNode { + cmds[branch.Name] = true + } + } + for _, branch := range node.Children { + for _, a := range branch.Aliases { + _, ok := cmds[a] + if token.Value == a && !ok { + token.Value = branch.Name + break + } + } + } + + // After positional arguments have been consumed, check commands next... + for _, branch := range node.Children { + if branch.Type == CommandNode && !branch.Hidden { + candidates = append(candidates, branch.Name) + } + if branch.Type == CommandNode && branch.Name == token.Value { + c.scan.Pop() + c.Path = append(c.Path, &Path{ + Parent: node, + Command: branch, + Flags: branch.Flags, + }) + return c.trace(branch) + } + } + + // Finally, check arguments. + for _, branch := range node.Children { + if branch.Type == ArgumentNode { + arg := branch.Argument + if err := arg.Parse(c.scan, c.getValue(arg)); err == nil { + c.Path = append(c.Path, &Path{ + Parent: node, + Argument: branch, + Flags: branch.Flags, + }) + return c.trace(branch) + } + } + } + + // If there is a default command that allows args and nothing else + // matches, take the branch of the default command + if node.DefaultCmd != nil && node.DefaultCmd.Tag.Default == "withargs" { + c.Path = append(c.Path, &Path{ + Parent: node, + Command: node.DefaultCmd, + Flags: node.DefaultCmd.Flags, + }) + return c.trace(node.DefaultCmd) + } + + return findPotentialCandidates(token.String(), candidates, "unexpected argument %s", token) + default: + return fmt.Errorf("unexpected token %s", token) + } + } + return c.maybeSelectDefault(flags, node) +} + +// End of the line, check for a default command, but only if we're not displaying help, +// otherwise we'd only ever display the help for the default command. +func (c *Context) maybeSelectDefault(flags []*Flag, node *Node) error { + for _, flag := range flags { + if flag.Name == "help" && flag.Set { + return nil + } + } + if node.DefaultCmd != nil { + c.Path = append(c.Path, &Path{ + Parent: node.DefaultCmd, + Command: node.DefaultCmd, + Flags: node.DefaultCmd.Flags, + }) + } + return nil +} + +// Resolve walks through the traced path, applying resolvers to any unset flags. +func (c *Context) Resolve() error { + resolvers := c.combineResolvers() + if len(resolvers) == 0 { + return nil + } + + inserted := []*Path{} + for _, path := range c.Path { + for _, flag := range path.Flags { + // Flag has already been set on the command-line. + if _, ok := c.values[flag.Value]; ok { + continue + } + + // Pick the last resolved value. + var selected interface{} + for _, resolver := range resolvers { + s, err := resolver.Resolve(c, path, flag) + if err != nil { + return fmt.Errorf("%s: %w", flag.ShortSummary(), err) + } + if s == nil { + continue + } + selected = s + } + + if selected == nil { + continue + } + + scan := Scan().PushTyped(selected, FlagValueToken) + delete(c.values, flag.Value) + err := flag.Parse(scan, c.getValue(flag.Value)) + if err != nil { + return err + } + inserted = append(inserted, &Path{ + Flag: flag, + Resolved: true, + }) + } + } + c.Path = append(c.Path, inserted...) + return nil +} + +// Combine application-level resolvers and context resolvers. +func (c *Context) combineResolvers() []Resolver { + resolvers := []Resolver{} + resolvers = append(resolvers, c.Kong.resolvers...) + resolvers = append(resolvers, c.resolvers...) + return resolvers +} + +func (c *Context) getValue(value *Value) reflect.Value { + v, ok := c.values[value] + if !ok { + v = reflect.New(value.Target.Type()).Elem() + switch v.Kind() { + case reflect.Ptr: + v.Set(reflect.New(v.Type().Elem())) + case reflect.Slice: + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + case reflect.Map: + v.Set(reflect.MakeMap(v.Type())) + default: + } + c.values[value] = v + } + return v +} + +// ApplyDefaults if they are not already set. +func (c *Context) ApplyDefaults() error { + return Visit(c.Model.Node, func(node Visitable, next Next) error { + var value *Value + switch node := node.(type) { + case *Flag: + value = node.Value + case *Node: + value = node.Argument + case *Value: + value = node + default: + } + if value != nil { + if err := value.ApplyDefault(); err != nil { + return err + } + } + return next(nil) + }) +} + +// Apply traced context to the target grammar. +func (c *Context) Apply() (string, error) { + path := []string{} + + for _, trace := range c.Path { + var value *Value + switch { + case trace.App != nil: + case trace.Argument != nil: + path = append(path, "<"+trace.Argument.Name+">") + value = trace.Argument.Argument + case trace.Command != nil: + path = append(path, trace.Command.Name) + case trace.Flag != nil: + value = trace.Flag.Value + case trace.Positional != nil: + path = append(path, "<"+trace.Positional.Name+">") + value = trace.Positional + default: + panic("unsupported path ?!") + } + if value != nil { + value.Apply(c.getValue(value)) + } + } + + return strings.Join(path, " "), nil +} + +func flipBoolValue(value reflect.Value) error { + if value.Kind() == reflect.Bool { + value.SetBool(!value.Bool()) + return nil + } + + if value.Kind() == reflect.Ptr { + if !value.IsNil() { + return flipBoolValue(value.Elem()) + } + return nil + } + + return fmt.Errorf("cannot negate a value of %s", value.Type().String()) +} + +func (c *Context) parseFlag(flags []*Flag, match string) (err error) { + candidates := []string{} + + for _, flag := range flags { + long := "--" + flag.Name + matched := long == match + candidates = append(candidates, long) + if flag.Short != 0 { + short := "-" + string(flag.Short) + matched = matched || (short == match) + candidates = append(candidates, short) + } + for _, alias := range flag.Aliases { + alias = "--" + alias + matched = matched || (alias == match) + candidates = append(candidates, alias) + } + + neg := "--no-" + flag.Name + if !matched && !(match == neg && flag.Tag.Negatable) { + continue + } + // Found a matching flag. + c.scan.Pop() + if match == neg && flag.Tag.Negatable { + flag.Negated = true + } + err := flag.Parse(c.scan, c.getValue(flag.Value)) + if err != nil { + var expected *expectedError + if errors.As(err, &expected) && expected.token.InferredType().IsAny(FlagToken, ShortFlagToken) { + return fmt.Errorf("%s; perhaps try %s=%q?", err.Error(), flag.ShortSummary(), expected.token) + } + return err + } + if flag.Negated { + value := c.getValue(flag.Value) + err := flipBoolValue(value) + if err != nil { + return err + } + flag.Value.Apply(value) + } + c.Path = append(c.Path, &Path{Flag: flag}) + return nil + } + return findPotentialCandidates(match, candidates, "unknown flag %s", match) +} + +// Call an arbitrary function filling arguments with bound values. +func (c *Context) Call(fn any, binds ...interface{}) (out []interface{}, err error) { + fv := reflect.ValueOf(fn) + bindings := c.Kong.bindings.clone().add(binds...).add(c).merge(c.bindings) //nolint:govet + return callAnyFunction(fv, bindings) +} + +// RunNode calls the Run() method on an arbitrary node. +// +// This is useful in conjunction with Visit(), for dynamically running commands. +// +// Any passed values will be bindable to arguments of the target Run() method. Additionally, +// all parent nodes in the command structure will be bound. +func (c *Context) RunNode(node *Node, binds ...interface{}) (err error) { + type targetMethod struct { + node *Node + method reflect.Value + binds bindings + } + methodBinds := c.Kong.bindings.clone().add(binds...).add(c).merge(c.bindings) + methods := []targetMethod{} + for i := 0; node != nil; i, node = i+1, node.Parent { + method := getMethod(node.Target, "Run") + methodBinds = methodBinds.clone() + for p := node; p != nil; p = p.Parent { + methodBinds = methodBinds.add(p.Target.Addr().Interface()) + } + if method.IsValid() { + methods = append(methods, targetMethod{node, method, methodBinds}) + } + } + if len(methods) == 0 { + return fmt.Errorf("no Run() method found in hierarchy of %s", c.Selected().Summary()) + } + _, err = c.Apply() + if err != nil { + return err + } + + for _, method := range methods { + if err = callFunction(method.method, method.binds); err != nil { + return err + } + } + return nil +} + +// Run executes the Run() method on the selected command, which must exist. +// +// Any passed values will be bindable to arguments of the target Run() method. Additionally, +// all parent nodes in the command structure will be bound. +func (c *Context) Run(binds ...interface{}) (err error) { + node := c.Selected() + if node == nil { + if len(c.Path) > 0 { + selected := c.Path[0].Node() + if selected.Type == ApplicationNode { + method := getMethod(selected.Target, "Run") + if method.IsValid() { + return c.RunNode(selected, binds...) + } + } + } + return fmt.Errorf("no command selected") + } + return c.RunNode(node, binds...) +} + +// PrintUsage to Kong's stdout. +// +// If summary is true, a summarised version of the help will be output. +func (c *Context) PrintUsage(summary bool) error { + options := c.helpOptions + options.Summary = summary + return c.help(options, c) +} + +func checkMissingFlags(flags []*Flag) error { + xorGroupSet := map[string]bool{} + xorGroup := map[string][]string{} + missing := []string{} + for _, flag := range flags { + if flag.Set { + for _, xor := range flag.Xor { + xorGroupSet[xor] = true + } + } + if !flag.Required || flag.Set { + continue + } + if len(flag.Xor) > 0 { + for _, xor := range flag.Xor { + if xorGroupSet[xor] { + continue + } + xorGroup[xor] = append(xorGroup[xor], flag.Summary()) + } + } else { + missing = append(missing, flag.Summary()) + } + } + for xor, flags := range xorGroup { + if !xorGroupSet[xor] && len(flags) > 1 { + missing = append(missing, strings.Join(flags, " or ")) + } + } + + if len(missing) == 0 { + return nil + } + + sort.Strings(missing) + + return fmt.Errorf("missing flags: %s", strings.Join(missing, ", ")) +} + +func checkMissingChildren(node *Node) error { + missing := []string{} + + missingArgs := []string{} + for _, arg := range node.Positional { + if arg.Required && !arg.Set { + missingArgs = append(missingArgs, arg.Summary()) + } + } + if len(missingArgs) > 0 { + missing = append(missing, strconv.Quote(strings.Join(missingArgs, " "))) + } + + for _, child := range node.Children { + if child.Hidden { + continue + } + if child.Argument != nil { + if !child.Argument.Required { + continue + } + missing = append(missing, strconv.Quote(child.Summary())) + } else { + missing = append(missing, strconv.Quote(child.Name)) + } + } + if len(missing) == 0 { + return nil + } + + if len(missing) > 5 { + missing = append(missing[:5], "...") + } + if len(missing) == 1 { + return fmt.Errorf("expected %s", missing[0]) + } + return fmt.Errorf("expected one of %s", strings.Join(missing, ", ")) +} + +// If we're missing any positionals and they're required, return an error. +func checkMissingPositionals(positional int, values []*Value) error { + // All the positionals are in. + if positional >= len(values) { + return nil + } + + // We're low on supplied positionals, but the missing one is optional. + if !values[positional].Required { + return nil + } + + missing := []string{} + for ; positional < len(values); positional++ { + arg := values[positional] + // TODO(aat): Fix hardcoding of these env checks all over the place :\ + if len(arg.Tag.Envs) != 0 { + if atLeastOneEnvSet(arg.Tag.Envs) { + continue + } + } + missing = append(missing, "<"+arg.Name+">") + } + if len(missing) == 0 { + return nil + } + return fmt.Errorf("missing positional arguments %s", strings.Join(missing, " ")) +} + +func checkEnum(value *Value, target reflect.Value) error { + switch target.Kind() { + case reflect.Slice, reflect.Array: + for i := 0; i < target.Len(); i++ { + if err := checkEnum(value, target.Index(i)); err != nil { + return err + } + } + return nil + + case reflect.Map, reflect.Struct: + return errors.New("enum can only be applied to a slice or value") + + case reflect.Ptr: + if target.IsNil() { + return nil + } + return checkEnum(value, target.Elem()) + default: + enumSlice := value.EnumSlice() + v := fmt.Sprintf("%v", target) + enums := []string{} + for _, enum := range enumSlice { + if enum == v { + return nil + } + enums = append(enums, fmt.Sprintf("%q", enum)) + } + return fmt.Errorf("%s must be one of %s but got %q", value.ShortSummary(), strings.Join(enums, ","), target.Interface()) + } +} + +func checkPassthroughArg(target reflect.Value) bool { + typ := target.Type() + switch typ.Kind() { + case reflect.Slice: + return typ.Elem().Kind() == reflect.String + default: + return false + } +} + +func checkXorDuplicates(paths []*Path) error { + for _, path := range paths { + seen := map[string]*Flag{} + for _, flag := range path.Flags { + if !flag.Set { + continue + } + for _, xor := range flag.Xor { + if seen[xor] != nil { + return fmt.Errorf("--%s and --%s can't be used together", seen[xor].Name, flag.Name) + } + seen[xor] = flag + } + } + } + return nil +} + +func findPotentialCandidates(needle string, haystack []string, format string, args ...interface{}) error { + if len(haystack) == 0 { + return fmt.Errorf(format, args...) + } + closestCandidates := []string{} + for _, candidate := range haystack { + if strings.HasPrefix(candidate, needle) || levenshtein(candidate, needle) <= 2 { + closestCandidates = append(closestCandidates, fmt.Sprintf("%q", candidate)) + } + } + prefix := fmt.Sprintf(format, args...) + if len(closestCandidates) == 1 { + return fmt.Errorf("%s, did you mean %s?", prefix, closestCandidates[0]) + } else if len(closestCandidates) > 1 { + return fmt.Errorf("%s, did you mean one of %s?", prefix, strings.Join(closestCandidates, ", ")) + } + return fmt.Errorf("%s", prefix) +} + +type validatable interface{ Validate() error } + +func isValidatable(v reflect.Value) validatable { + if !v.IsValid() || (v.Kind() == reflect.Ptr || v.Kind() == reflect.Slice || v.Kind() == reflect.Map) && v.IsNil() { + return nil + } + if validate, ok := v.Interface().(validatable); ok { + return validate + } + if v.CanAddr() { + return isValidatable(v.Addr()) + } + return nil +} + +func atLeastOneEnvSet(envs []string) bool { + for _, env := range envs { + if _, ok := os.LookupEnv(env); ok { + return true + } + } + return false +} diff --git a/vendor/github.com/alecthomas/kong/defaults.go b/vendor/github.com/alecthomas/kong/defaults.go new file mode 100644 index 00000000..f6728d79 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/defaults.go @@ -0,0 +1,21 @@ +package kong + +// ApplyDefaults if they are not already set. +func ApplyDefaults(target interface{}, options ...Option) error { + app, err := New(target, options...) + if err != nil { + return err + } + ctx, err := Trace(app, nil) + if err != nil { + return err + } + err = ctx.Resolve() + if err != nil { + return err + } + if err = ctx.ApplyDefaults(); err != nil { + return err + } + return ctx.Validate() +} diff --git a/vendor/github.com/alecthomas/kong/doc.go b/vendor/github.com/alecthomas/kong/doc.go new file mode 100644 index 00000000..7e53da7f --- /dev/null +++ b/vendor/github.com/alecthomas/kong/doc.go @@ -0,0 +1,32 @@ +// Package kong aims to support arbitrarily complex command-line structures with as little developer effort as possible. +// +// Here's an example: +// +// shell rm [-f] [-r] ... +// shell ls [ ...] +// +// This can be represented by the following command-line structure: +// +// package main +// +// import "github.com/alecthomas/kong" +// +// var CLI struct { +// Rm struct { +// Force bool `short:"f" help:"Force removal."` +// Recursive bool `short:"r" help:"Recursively remove files."` +// +// Paths []string `arg help:"Paths to remove." type:"path"` +// } `cmd help:"Remove files."` +// +// Ls struct { +// Paths []string `arg optional help:"Paths to list." type:"path"` +// } `cmd help:"List paths."` +// } +// +// func main() { +// kong.Parse(&CLI) +// } +// +// See https://github.com/alecthomas/kong for details. +package kong diff --git a/vendor/github.com/alecthomas/kong/error.go b/vendor/github.com/alecthomas/kong/error.go new file mode 100644 index 00000000..18225ef5 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/error.go @@ -0,0 +1,12 @@ +package kong + +// ParseError is the error type returned by Kong.Parse(). +// +// It contains the parse Context that triggered the error. +type ParseError struct { + error + Context *Context +} + +// Unwrap returns the original cause of the error. +func (p *ParseError) Unwrap() error { return p.error } diff --git a/vendor/github.com/alecthomas/kong/global.go b/vendor/github.com/alecthomas/kong/global.go new file mode 100644 index 00000000..d4b3cb56 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/global.go @@ -0,0 +1,16 @@ +package kong + +import ( + "os" +) + +// Parse constructs a new parser and parses the default command-line. +func Parse(cli interface{}, options ...Option) *Context { + parser, err := New(cli, options...) + if err != nil { + panic(err) + } + ctx, err := parser.Parse(os.Args[1:]) + parser.FatalIfErrorf(err) + return ctx +} diff --git a/vendor/github.com/alecthomas/kong/guesswidth.go b/vendor/github.com/alecthomas/kong/guesswidth.go new file mode 100644 index 00000000..dfdc3f51 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/guesswidth.go @@ -0,0 +1,10 @@ +//go:build appengine || (!linux && !freebsd && !darwin && !dragonfly && !netbsd && !openbsd) +// +build appengine !linux,!freebsd,!darwin,!dragonfly,!netbsd,!openbsd + +package kong + +import "io" + +func guessWidth(w io.Writer) int { + return 80 +} diff --git a/vendor/github.com/alecthomas/kong/guesswidth_unix.go b/vendor/github.com/alecthomas/kong/guesswidth_unix.go new file mode 100644 index 00000000..0170055a --- /dev/null +++ b/vendor/github.com/alecthomas/kong/guesswidth_unix.go @@ -0,0 +1,42 @@ +//go:build (!appengine && linux) || freebsd || darwin || dragonfly || netbsd || openbsd +// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd + +package kong + +import ( + "io" + "os" + "strconv" + "syscall" + "unsafe" +) + +func guessWidth(w io.Writer) int { + // check if COLUMNS env is set to comply with + // http://pubs.opengroup.org/onlinepubs/009604499/basedefs/xbd_chap08.html + colsStr := os.Getenv("COLUMNS") + if colsStr != "" { + if cols, err := strconv.Atoi(colsStr); err == nil { + return cols + } + } + + if t, ok := w.(*os.File); ok { + fd := t.Fd() + var dimensions [4]uint16 + + if _, _, err := syscall.Syscall6( + syscall.SYS_IOCTL, + uintptr(fd), //nolint: unconvert + uintptr(syscall.TIOCGWINSZ), + uintptr(unsafe.Pointer(&dimensions)), //nolint: gas + 0, 0, 0, + ); err == 0 { + if dimensions[1] == 0 { + return 80 + } + return int(dimensions[1]) + } + } + return 80 +} diff --git a/vendor/github.com/alecthomas/kong/help.go b/vendor/github.com/alecthomas/kong/help.go new file mode 100644 index 00000000..cf5a912c --- /dev/null +++ b/vendor/github.com/alecthomas/kong/help.go @@ -0,0 +1,579 @@ +package kong + +import ( + "bytes" + "fmt" + "go/doc" + "io" + "strings" +) + +const ( + defaultIndent = 2 + defaultColumnPadding = 4 +) + +// Help flag. +type helpValue bool + +func (h helpValue) BeforeReset(ctx *Context) error { + options := ctx.Kong.helpOptions + options.Summary = false + err := ctx.Kong.help(options, ctx) + if err != nil { + return err + } + ctx.Kong.Exit(0) + return nil +} + +// HelpOptions for HelpPrinters. +type HelpOptions struct { + // Don't print top-level usage summary. + NoAppSummary bool + + // Write a one-line summary of the context. + Summary bool + + // Write help in a more compact, but still fully-specified, form. + Compact bool + + // Tree writes command chains in a tree structure instead of listing them separately. + Tree bool + + // Place the flags after the commands listing. + FlagsLast bool + + // Indenter modulates the given prefix for the next layer in the tree view. + // The following exported templates can be used: kong.SpaceIndenter, kong.LineIndenter, kong.TreeIndenter + // The kong.SpaceIndenter will be used by default. + Indenter HelpIndenter + + // Don't show the help associated with subcommands + NoExpandSubcommands bool + + // Clamp the help wrap width to a value smaller than the terminal width. + // If this is set to a non-positive number, the terminal width is used; otherwise, + // the min of this value or the terminal width is used. + WrapUpperBound int +} + +// Apply options to Kong as a configuration option. +func (h HelpOptions) Apply(k *Kong) error { + k.helpOptions = h + return nil +} + +// HelpProvider can be implemented by commands/args to provide detailed help. +type HelpProvider interface { + // This string is formatted by go/doc and thus has the same formatting rules. + Help() string +} + +// PlaceHolderProvider can be implemented by mappers to provide custom placeholder text. +type PlaceHolderProvider interface { + PlaceHolder(flag *Flag) string +} + +// HelpIndenter is used to indent new layers in the help tree. +type HelpIndenter func(prefix string) string + +// HelpPrinter is used to print context-sensitive help. +type HelpPrinter func(options HelpOptions, ctx *Context) error + +// HelpValueFormatter is used to format the help text of flags and positional arguments. +type HelpValueFormatter func(value *Value) string + +// DefaultHelpValueFormatter is the default HelpValueFormatter. +func DefaultHelpValueFormatter(value *Value) string { + if len(value.Tag.Envs) == 0 || HasInterpolatedVar(value.OrigHelp, "env") { + return value.Help + } + suffix := "(" + formatEnvs(value.Tag.Envs) + ")" + switch { + case strings.HasSuffix(value.Help, "."): + return value.Help[:len(value.Help)-1] + " " + suffix + "." + case value.Help == "": + return suffix + default: + return value.Help + " " + suffix + } +} + +// DefaultShortHelpPrinter is the default HelpPrinter for short help on error. +func DefaultShortHelpPrinter(options HelpOptions, ctx *Context) error { + w := newHelpWriter(ctx, options) + cmd := ctx.Selected() + app := ctx.Model + if cmd == nil { + w.Printf("Usage: %s%s", app.Name, app.Summary()) + w.Printf(`Run "%s --help" for more information.`, app.Name) + } else { + w.Printf("Usage: %s %s", app.Name, cmd.Summary()) + w.Printf(`Run "%s --help" for more information.`, cmd.FullPath()) + } + return w.Write(ctx.Stdout) +} + +// DefaultHelpPrinter is the default HelpPrinter. +func DefaultHelpPrinter(options HelpOptions, ctx *Context) error { + if ctx.Empty() { + options.Summary = false + } + w := newHelpWriter(ctx, options) + selected := ctx.Selected() + if selected == nil { + printApp(w, ctx.Model) + } else { + printCommand(w, ctx.Model, selected) + } + return w.Write(ctx.Stdout) +} + +func printApp(w *helpWriter, app *Application) { + if !w.NoAppSummary { + w.Printf("Usage: %s%s", app.Name, app.Summary()) + } + printNodeDetail(w, app.Node, true) + cmds := app.Leaves(true) + if len(cmds) > 0 && app.HelpFlag != nil { + w.Print("") + if w.Summary { + w.Printf(`Run "%s --help" for more information.`, app.Name) + } else { + w.Printf(`Run "%s --help" for more information on a command.`, app.Name) + } + } +} + +func printCommand(w *helpWriter, app *Application, cmd *Command) { + if !w.NoAppSummary { + w.Printf("Usage: %s %s", app.Name, cmd.Summary()) + } + printNodeDetail(w, cmd, true) + if w.Summary && app.HelpFlag != nil { + w.Print("") + w.Printf(`Run "%s --help" for more information.`, cmd.FullPath()) + } +} + +func printNodeDetail(w *helpWriter, node *Node, hide bool) { + if node.Help != "" { + w.Print("") + w.Wrap(node.Help) + } + if w.Summary { + return + } + if node.Detail != "" { + w.Print("") + w.Wrap(node.Detail) + } + if len(node.Positional) > 0 { + w.Print("") + w.Print("Arguments:") + writePositionals(w.Indent(), node.Positional) + } + printFlags := func() { + if flags := node.AllFlags(true); len(flags) > 0 { + groupedFlags := collectFlagGroups(flags) + for _, group := range groupedFlags { + w.Print("") + if group.Metadata.Title != "" { + w.Wrap(group.Metadata.Title) + } + if group.Metadata.Description != "" { + w.Indent().Wrap(group.Metadata.Description) + w.Print("") + } + writeFlags(w.Indent(), group.Flags) + } + } + } + if !w.FlagsLast { + printFlags() + } + var cmds []*Node + if w.NoExpandSubcommands { + cmds = node.Children + } else { + cmds = node.Leaves(hide) + } + if len(cmds) > 0 { + iw := w.Indent() + if w.Tree { + w.Print("") + w.Print("Commands:") + writeCommandTree(iw, node) + } else { + groupedCmds := collectCommandGroups(cmds) + for _, group := range groupedCmds { + w.Print("") + if group.Metadata.Title != "" { + w.Wrap(group.Metadata.Title) + } + if group.Metadata.Description != "" { + w.Indent().Wrap(group.Metadata.Description) + w.Print("") + } + + if w.Compact { + writeCompactCommandList(group.Commands, iw) + } else { + writeCommandList(group.Commands, iw) + } + } + } + } + if w.FlagsLast { + printFlags() + } +} + +func writeCommandList(cmds []*Node, iw *helpWriter) { + for i, cmd := range cmds { + if cmd.Hidden { + continue + } + printCommandSummary(iw, cmd) + if i != len(cmds)-1 { + iw.Print("") + } + } +} + +func writeCompactCommandList(cmds []*Node, iw *helpWriter) { + rows := [][2]string{} + for _, cmd := range cmds { + if cmd.Hidden { + continue + } + rows = append(rows, [2]string{cmd.Path(), cmd.Help}) + } + writeTwoColumns(iw, rows) +} + +func writeCommandTree(w *helpWriter, node *Node) { + rows := make([][2]string, 0, len(node.Children)*2) + for i, cmd := range node.Children { + if cmd.Hidden { + continue + } + rows = append(rows, w.CommandTree(cmd, "")...) + if i != len(node.Children)-1 { + rows = append(rows, [2]string{"", ""}) + } + } + writeTwoColumns(w, rows) +} + +type helpFlagGroup struct { + Metadata *Group + Flags [][]*Flag +} + +func collectFlagGroups(flags [][]*Flag) []helpFlagGroup { + // Group keys in order of appearance. + groups := []*Group{} + // Flags grouped by their group key. + flagsByGroup := map[string][][]*Flag{} + + for _, levelFlags := range flags { + levelFlagsByGroup := map[string][]*Flag{} + + for _, flag := range levelFlags { + key := "" + if flag.Group != nil { + key = flag.Group.Key + groupAlreadySeen := false + for _, group := range groups { + if key == group.Key { + groupAlreadySeen = true + break + } + } + if !groupAlreadySeen { + groups = append(groups, flag.Group) + } + } + + levelFlagsByGroup[key] = append(levelFlagsByGroup[key], flag) + } + + for key, flags := range levelFlagsByGroup { + flagsByGroup[key] = append(flagsByGroup[key], flags) + } + } + + out := []helpFlagGroup{} + // Ungrouped flags are always displayed first. + if ungroupedFlags, ok := flagsByGroup[""]; ok { + out = append(out, helpFlagGroup{ + Metadata: &Group{Title: "Flags:"}, + Flags: ungroupedFlags, + }) + } + for _, group := range groups { + out = append(out, helpFlagGroup{Metadata: group, Flags: flagsByGroup[group.Key]}) + } + return out +} + +type helpCommandGroup struct { + Metadata *Group + Commands []*Node +} + +func collectCommandGroups(nodes []*Node) []helpCommandGroup { + // Groups in order of appearance. + groups := []*Group{} + // Nodes grouped by their group key. + nodesByGroup := map[string][]*Node{} + + for _, node := range nodes { + key := "" + if group := node.ClosestGroup(); group != nil { + key = group.Key + if _, ok := nodesByGroup[key]; !ok { + groups = append(groups, group) + } + } + nodesByGroup[key] = append(nodesByGroup[key], node) + } + + out := []helpCommandGroup{} + // Ungrouped nodes are always displayed first. + if ungroupedNodes, ok := nodesByGroup[""]; ok { + out = append(out, helpCommandGroup{ + Metadata: &Group{Title: "Commands:"}, + Commands: ungroupedNodes, + }) + } + for _, group := range groups { + out = append(out, helpCommandGroup{Metadata: group, Commands: nodesByGroup[group.Key]}) + } + return out +} + +func printCommandSummary(w *helpWriter, cmd *Command) { + w.Print(cmd.Summary()) + if cmd.Help != "" { + w.Indent().Wrap(cmd.Help) + } +} + +type helpWriter struct { + indent string + width int + lines *[]string + helpFormatter HelpValueFormatter + HelpOptions +} + +func newHelpWriter(ctx *Context, options HelpOptions) *helpWriter { + lines := []string{} + wrapWidth := guessWidth(ctx.Stdout) + if options.WrapUpperBound > 0 && wrapWidth > options.WrapUpperBound { + wrapWidth = options.WrapUpperBound + } + w := &helpWriter{ + indent: "", + width: wrapWidth, + lines: &lines, + helpFormatter: ctx.Kong.helpFormatter, + HelpOptions: options, + } + return w +} + +func (h *helpWriter) Printf(format string, args ...interface{}) { + h.Print(fmt.Sprintf(format, args...)) +} + +func (h *helpWriter) Print(text string) { + *h.lines = append(*h.lines, strings.TrimRight(h.indent+text, " ")) +} + +// Indent returns a new helpWriter indented by two characters. +func (h *helpWriter) Indent() *helpWriter { + return &helpWriter{indent: h.indent + " ", lines: h.lines, width: h.width - 2, HelpOptions: h.HelpOptions, helpFormatter: h.helpFormatter} +} + +func (h *helpWriter) String() string { + return strings.Join(*h.lines, "\n") +} + +func (h *helpWriter) Write(w io.Writer) error { + for _, line := range *h.lines { + _, err := io.WriteString(w, line+"\n") + if err != nil { + return err + } + } + return nil +} + +func (h *helpWriter) Wrap(text string) { + w := bytes.NewBuffer(nil) + doc.ToText(w, strings.TrimSpace(text), "", " ", h.width) + for _, line := range strings.Split(strings.TrimSpace(w.String()), "\n") { + h.Print(line) + } +} + +func writePositionals(w *helpWriter, args []*Positional) { + rows := [][2]string{} + for _, arg := range args { + rows = append(rows, [2]string{arg.Summary(), w.helpFormatter(arg)}) + } + writeTwoColumns(w, rows) +} + +func writeFlags(w *helpWriter, groups [][]*Flag) { + rows := [][2]string{} + haveShort := false + for _, group := range groups { + for _, flag := range group { + if flag.Short != 0 { + haveShort = true + break + } + } + } + for i, group := range groups { + if i > 0 { + rows = append(rows, [2]string{"", ""}) + } + for _, flag := range group { + if !flag.Hidden { + rows = append(rows, [2]string{formatFlag(haveShort, flag), w.helpFormatter(flag.Value)}) + } + } + } + writeTwoColumns(w, rows) +} + +func writeTwoColumns(w *helpWriter, rows [][2]string) { + maxLeft := 375 * w.width / 1000 + if maxLeft < 30 { + maxLeft = 30 + } + // Find size of first column. + leftSize := 0 + for _, row := range rows { + if c := len(row[0]); c > leftSize && c < maxLeft { + leftSize = c + } + } + + offsetStr := strings.Repeat(" ", leftSize+defaultColumnPadding) + + for _, row := range rows { + buf := bytes.NewBuffer(nil) + doc.ToText(buf, row[1], "", strings.Repeat(" ", defaultIndent), w.width-leftSize-defaultColumnPadding) + lines := strings.Split(strings.TrimRight(buf.String(), "\n"), "\n") + + line := fmt.Sprintf("%-*s", leftSize, row[0]) + if len(row[0]) < maxLeft { + line += fmt.Sprintf("%*s%s", defaultColumnPadding, "", lines[0]) + lines = lines[1:] + } + w.Print(line) + for _, line := range lines { + w.Printf("%s%s", offsetStr, line) + } + } +} + +// haveShort will be true if there are short flags present at all in the help. Useful for column alignment. +func formatFlag(haveShort bool, flag *Flag) string { + flagString := "" + name := flag.Name + isBool := flag.IsBool() + isCounter := flag.IsCounter() + if flag.Short != 0 { + if isBool && flag.Tag.Negatable { + flagString += fmt.Sprintf("-%c, --[no-]%s", flag.Short, name) + } else { + flagString += fmt.Sprintf("-%c, --%s", flag.Short, name) + } + } else { + if isBool && flag.Tag.Negatable { + if haveShort { + flagString = fmt.Sprintf(" --[no-]%s", name) + } else { + flagString = fmt.Sprintf("--[no-]%s", name) + } + } else { + if haveShort { + flagString += fmt.Sprintf(" --%s", name) + } else { + flagString += fmt.Sprintf("--%s", name) + } + } + } + if !isBool && !isCounter { + flagString += fmt.Sprintf("=%s", flag.FormatPlaceHolder()) + } + return flagString +} + +// CommandTree creates a tree with the given node name as root and its children's arguments and sub commands as leaves. +func (h *HelpOptions) CommandTree(node *Node, prefix string) (rows [][2]string) { + var nodeName string + switch node.Type { + default: + nodeName += prefix + node.Name + if len(node.Aliases) != 0 { + nodeName += fmt.Sprintf(" (%s)", strings.Join(node.Aliases, ",")) + } + case ArgumentNode: + nodeName += prefix + "<" + node.Name + ">" + } + rows = append(rows, [2]string{nodeName, node.Help}) + if h.Indenter == nil { + prefix = SpaceIndenter(prefix) + } else { + prefix = h.Indenter(prefix) + } + for _, arg := range node.Positional { + rows = append(rows, [2]string{prefix + arg.Summary(), arg.Help}) + } + for _, subCmd := range node.Children { + if subCmd.Hidden { + continue + } + rows = append(rows, h.CommandTree(subCmd, prefix)...) + } + return +} + +// SpaceIndenter adds a space indent to the given prefix. +func SpaceIndenter(prefix string) string { + return prefix + strings.Repeat(" ", defaultIndent) +} + +// LineIndenter adds line points to every new indent. +func LineIndenter(prefix string) string { + if prefix == "" { + return "- " + } + return strings.Repeat(" ", defaultIndent) + prefix +} + +// TreeIndenter adds line points to every new indent and vertical lines to every layer. +func TreeIndenter(prefix string) string { + if prefix == "" { + return "|- " + } + return "|" + strings.Repeat(" ", defaultIndent) + prefix +} + +func formatEnvs(envs []string) string { + formatted := make([]string, len(envs)) + for i := range envs { + formatted[i] = "$" + envs[i] + } + + return strings.Join(formatted, ", ") +} diff --git a/vendor/github.com/alecthomas/kong/hooks.go b/vendor/github.com/alecthomas/kong/hooks.go new file mode 100644 index 00000000..d166b088 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/hooks.go @@ -0,0 +1,19 @@ +package kong + +// BeforeResolve is a documentation-only interface describing hooks that run before resolvers are applied. +type BeforeResolve interface { + // This is not the correct signature - see README for details. + BeforeResolve(args ...interface{}) error +} + +// BeforeApply is a documentation-only interface describing hooks that run before values are set. +type BeforeApply interface { + // This is not the correct signature - see README for details. + BeforeApply(args ...interface{}) error +} + +// AfterApply is a documentation-only interface describing hooks that run after values are set. +type AfterApply interface { + // This is not the correct signature - see README for details. + AfterApply(args ...interface{}) error +} diff --git a/vendor/github.com/alecthomas/kong/interpolate.go b/vendor/github.com/alecthomas/kong/interpolate.go new file mode 100644 index 00000000..e811632d --- /dev/null +++ b/vendor/github.com/alecthomas/kong/interpolate.go @@ -0,0 +1,52 @@ +package kong + +import ( + "fmt" + "regexp" +) + +var interpolationRegex = regexp.MustCompile(`(\$\$)|((?:\${([[:alpha:]_][[:word:]]*))(?:=([^}]+))?})|(\$)|([^$]+)`) + +// HasInterpolatedVar returns true if the variable "v" is interpolated in "s". +func HasInterpolatedVar(s string, v string) bool { + matches := interpolationRegex.FindAllStringSubmatch(s, -1) + for _, match := range matches { + if name := match[3]; name == v { + return true + } + } + return false +} + +// Interpolate variables from vars into s for substrings in the form ${var} or ${var=default}. +func interpolate(s string, vars Vars, updatedVars map[string]string) (string, error) { + out := "" + matches := interpolationRegex.FindAllStringSubmatch(s, -1) + if len(matches) == 0 { + return s, nil + } + for key, val := range updatedVars { + if vars[key] != val { + vars = vars.CloneWith(updatedVars) + break + } + } + for _, match := range matches { + if dollar := match[1]; dollar != "" { + out += "$" + } else if name := match[3]; name != "" { + value, ok := vars[name] + if !ok { + // No default value. + if match[4] == "" { + return "", fmt.Errorf("undefined variable ${%s}", name) + } + value = match[4] + } + out += value + } else { + out += match[0] + } + } + return out, nil +} diff --git a/vendor/github.com/alecthomas/kong/kong.go b/vendor/github.com/alecthomas/kong/kong.go new file mode 100644 index 00000000..76eaefe7 --- /dev/null +++ b/vendor/github.com/alecthomas/kong/kong.go @@ -0,0 +1,449 @@ +package kong + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "regexp" + "strings" +) + +var ( + callbackReturnSignature = reflect.TypeOf((*error)(nil)).Elem() +) + +func failField(parent reflect.Value, field reflect.StructField, format string, args ...interface{}) error { + name := parent.Type().Name() + if name == "" { + name = "" + } + return fmt.Errorf("%s.%s: %s", name, field.Name, fmt.Sprintf(format, args...)) +} + +// Must creates a new Parser or panics if there is an error. +func Must(ast interface{}, options ...Option) *Kong { + k, err := New(ast, options...) + if err != nil { + panic(err) + } + return k +} + +type usageOnError int + +const ( + shortUsage usageOnError = iota + 1 + fullUsage +) + +// Kong is the main parser type. +type Kong struct { + // Grammar model. + Model *Application + + // Termination function (defaults to os.Exit) + Exit func(int) + + Stdout io.Writer + Stderr io.Writer + + bindings bindings + loader ConfigurationLoader + resolvers []Resolver + registry *Registry + ignoreFields []*regexp.Regexp + + noDefaultHelp bool + usageOnError usageOnError + help HelpPrinter + shortHelp HelpPrinter + helpFormatter HelpValueFormatter + helpOptions HelpOptions + helpFlag *Flag + groups []Group + vars Vars + flagNamer func(string) string + + // Set temporarily by Options. These are applied after build(). + postBuildOptions []Option + embedded []embedded + dynamicCommands []*dynamicCommand +} + +// New creates a new Kong parser on grammar. +// +// See the README (https://github.com/alecthomas/kong) for usage instructions. +func New(grammar interface{}, options ...Option) (*Kong, error) { + k := &Kong{ + Exit: os.Exit, + Stdout: os.Stdout, + Stderr: os.Stderr, + registry: NewRegistry().RegisterDefaults(), + vars: Vars{}, + bindings: bindings{}, + helpFormatter: DefaultHelpValueFormatter, + ignoreFields: make([]*regexp.Regexp, 0), + flagNamer: func(s string) string { + return strings.ToLower(dashedString(s)) + }, + } + + options = append(options, Bind(k)) + + for _, option := range options { + if err := option.Apply(k); err != nil { + return nil, err + } + } + + if k.help == nil { + k.help = DefaultHelpPrinter + } + + if k.shortHelp == nil { + k.shortHelp = DefaultShortHelpPrinter + } + + model, err := build(k, grammar) + if err != nil { + return k, err + } + model.Name = filepath.Base(os.Args[0]) + k.Model = model + k.Model.HelpFlag = k.helpFlag + + // Embed any embedded structs. + for _, embed := range k.embedded { + tag, err := parseTagString(strings.Join(embed.tags, " ")) //nolint:govet + if err != nil { + return nil, err + } + tag.Embed = true + v := reflect.Indirect(reflect.ValueOf(embed.strct)) + node, err := buildNode(k, v, CommandNode, tag, map[string]bool{}) + if err != nil { + return nil, err + } + for _, child := range node.Children { + child.Parent = k.Model.Node + k.Model.Children = append(k.Model.Children, child) + } + k.Model.Flags = append(k.Model.Flags, node.Flags...) + } + + // Synthesise command nodes. + for _, dcmd := range k.dynamicCommands { + tag, terr := parseTagString(strings.Join(dcmd.tags, " ")) + if terr != nil { + return nil, terr + } + tag.Name = dcmd.name + tag.Help = dcmd.help + tag.Group = dcmd.group + tag.Cmd = true + v := reflect.Indirect(reflect.ValueOf(dcmd.cmd)) + err = buildChild(k, k.Model.Node, CommandNode, reflect.Value{}, reflect.StructField{ + Name: dcmd.name, + Type: v.Type(), + }, v, tag, dcmd.name, map[string]bool{}) + if err != nil { + return nil, err + } + } + + for _, option := range k.postBuildOptions { + if err = option.Apply(k); err != nil { + return nil, err + } + } + k.postBuildOptions = nil + + if err = k.interpolate(k.Model.Node); err != nil { + return nil, err + } + + k.bindings.add(k.vars) + + return k, nil +} + +type varStack []Vars + +func (v *varStack) head() Vars { return (*v)[len(*v)-1] } +func (v *varStack) pop() { *v = (*v)[:len(*v)-1] } +func (v *varStack) push(vars Vars) Vars { + if len(*v) != 0 { + vars = (*v)[len(*v)-1].CloneWith(vars) + } + *v = append(*v, vars) + return vars +} + +// Interpolate variables into model. +func (k *Kong) interpolate(node *Node) (err error) { + stack := varStack{} + return Visit(node, func(node Visitable, next Next) error { + switch node := node.(type) { + case *Node: + vars := stack.push(node.Vars()) + node.Help, err = interpolate(node.Help, vars, nil) + if err != nil { + return fmt.Errorf("help for %s: %s", node.Path(), err) + } + err = next(nil) + stack.pop() + return err + + case *Value: + return next(k.interpolateValue(node, stack.head())) + } + return next(nil) + }) +} + +func (k *Kong) interpolateValue(value *Value, vars Vars) (err error) { + if len(value.Tag.Vars) > 0 { + vars = vars.CloneWith(value.Tag.Vars) + } + if varsContributor, ok := value.Mapper.(VarsContributor); ok { + vars = vars.CloneWith(varsContributor.Vars(value)) + } + + if value.Enum, err = interpolate(value.Enum, vars, nil); err != nil { + return fmt.Errorf("enum for %s: %s", value.Summary(), err) + } + + updatedVars := map[string]string{ + "default": value.Default, + "enum": value.Enum, + } + if value.Default, err = interpolate(value.Default, vars, nil); err != nil { + return fmt.Errorf("default value for %s: %s", value.Summary(), err) + } + if value.Enum, err = interpolate(value.Enum, vars, nil); err != nil { + return fmt.Errorf("enum value for %s: %s", value.Summary(), err) + } + if value.Flag != nil { + for i, env := range value.Flag.Envs { + if value.Flag.Envs[i], err = interpolate(env, vars, nil); err != nil { + return fmt.Errorf("env value for %s: %s", value.Summary(), err) + } + } + value.Tag.Envs = value.Flag.Envs + updatedVars["env"] = "" + if len(value.Flag.Envs) != 0 { + updatedVars["env"] = value.Flag.Envs[0] + } + } + value.Help, err = interpolate(value.Help, vars, updatedVars) + if err != nil { + return fmt.Errorf("help for %s: %s", value.Summary(), err) + } + return nil +} + +// Provide additional builtin flags, if any. +func (k *Kong) extraFlags() []*Flag { + if k.noDefaultHelp { + return nil + } + var helpTarget helpValue + value := reflect.ValueOf(&helpTarget).Elem() + helpFlag := &Flag{ + Short: 'h', + Value: &Value{ + Name: "help", + Help: "Show context-sensitive help.", + OrigHelp: "Show context-sensitive help.", + Target: value, + Tag: &Tag{}, + Mapper: k.registry.ForValue(value), + DefaultValue: reflect.ValueOf(false), + }, + } + helpFlag.Flag = helpFlag + k.helpFlag = helpFlag + return []*Flag{helpFlag} +} + +// Parse arguments into target. +// +// The return Context can be used to further inspect the parsed command-line, to format help, to find the +// selected command, to run command Run() methods, and so on. See Context and README for more information. +// +// Will return a ParseError if a *semantically* invalid command-line is encountered (as opposed to a syntactically +// invalid one, which will report a normal error). +func (k *Kong) Parse(args []string) (ctx *Context, err error) { + ctx, err = Trace(k, args) + if err != nil { + return nil, err + } + if ctx.Error != nil { + return nil, &ParseError{error: ctx.Error, Context: ctx} + } + if err = k.applyHook(ctx, "BeforeReset"); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = ctx.Reset(); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = k.applyHook(ctx, "BeforeResolve"); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = ctx.Resolve(); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = k.applyHook(ctx, "BeforeApply"); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if _, err = ctx.Apply(); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = ctx.Validate(); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + if err = k.applyHook(ctx, "AfterApply"); err != nil { + return nil, &ParseError{error: err, Context: ctx} + } + return ctx, nil +} + +func (k *Kong) applyHook(ctx *Context, name string) error { + for _, trace := range ctx.Path { + var value reflect.Value + switch { + case trace.App != nil: + value = trace.App.Target + case trace.Argument != nil: + value = trace.Argument.Target + case trace.Command != nil: + value = trace.Command.Target + case trace.Positional != nil: + value = trace.Positional.Target + case trace.Flag != nil: + value = trace.Flag.Value.Target + default: + panic("unsupported Path") + } + method := getMethod(value, name) + if !method.IsValid() { + continue + } + binds := k.bindings.clone() + binds.add(ctx, trace) + binds.add(trace.Node().Vars().CloneWith(k.vars)) + binds.merge(ctx.bindings) + if err := callFunction(method, binds); err != nil { + return err + } + } + // Path[0] will always be the app root. + return k.applyHookToDefaultFlags(ctx, ctx.Path[0].Node(), name) +} + +// Call hook on any unset flags with default values. +func (k *Kong) applyHookToDefaultFlags(ctx *Context, node *Node, name string) error { + if node == nil { + return nil + } + return Visit(node, func(n Visitable, next Next) error { + node, ok := n.(*Node) + if !ok { + return next(nil) + } + binds := k.bindings.clone().add(ctx).add(node.Vars().CloneWith(k.vars)) + for _, flag := range node.Flags { + if !flag.HasDefault || ctx.values[flag.Value].IsValid() || !flag.Target.IsValid() { + continue + } + method := getMethod(flag.Target, name) + if !method.IsValid() { + continue + } + path := &Path{Flag: flag} + if err := callFunction(method, binds.clone().add(path)); err != nil { + return next(err) + } + } + return next(nil) + }) +} + +func formatMultilineMessage(w io.Writer, leaders []string, format string, args ...interface{}) { + lines := strings.Split(fmt.Sprintf(format, args...), "\n") + leader := "" + for _, l := range leaders { + if l == "" { + continue + } + leader += l + ": " + } + fmt.Fprintf(w, "%s%s\n", leader, lines[0]) + for _, line := range lines[1:] { + fmt.Fprintf(w, "%*s%s\n", len(leader), " ", line) + } +} + +// Printf writes a message to Kong.Stdout with the application name prefixed. +func (k *Kong) Printf(format string, args ...interface{}) *Kong { + formatMultilineMessage(k.Stdout, []string{k.Model.Name}, format, args...) + return k +} + +// Errorf writes a message to Kong.Stderr with the application name prefixed. +func (k *Kong) Errorf(format string, args ...interface{}) *Kong { + formatMultilineMessage(k.Stderr, []string{k.Model.Name, "error"}, format, args...) + return k +} + +// Fatalf writes a message to Kong.Stderr with the application name prefixed then exits with a non-zero status. +func (k *Kong) Fatalf(format string, args ...interface{}) { + k.Errorf(format, args...) + k.Exit(1) +} + +// FatalIfErrorf terminates with an error message if err != nil. +func (k *Kong) FatalIfErrorf(err error, args ...interface{}) { + if err == nil { + return + } + msg := err.Error() + if len(args) > 0 { + msg = fmt.Sprintf(args[0].(string), args[1:]...) + ": " + err.Error() //nolint + } + // Maybe display usage information. + var parseErr *ParseError + if errors.As(err, &parseErr) { + switch k.usageOnError { + case fullUsage: + _ = k.help(k.helpOptions, parseErr.Context) + fmt.Fprintln(k.Stdout) + case shortUsage: + _ = k.shortHelp(k.helpOptions, parseErr.Context) + fmt.Fprintln(k.Stdout) + } + } + k.Fatalf("%s", msg) +} + +// LoadConfig from path using the loader configured via Configuration(loader). +// +// "path" will have ~ and any variables expanded. +func (k *Kong) LoadConfig(path string) (Resolver, error) { + var err error + path = ExpandPath(path) + path, err = interpolate(path, k.vars, nil) + if err != nil { + return nil, err + } + r, err := os.Open(path) //nolint: gas + if err != nil { + return nil, err + } + defer r.Close() + + return k.loader(r) +} diff --git a/vendor/github.com/alecthomas/kong/kong.png b/vendor/github.com/alecthomas/kong/kong.png new file mode 100644 index 0000000000000000000000000000000000000000..151fb08dbd4858c4fbebb76f46bf6c6535f8f099 GIT binary patch literal 68610 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%0Au<7CSicYLeX!B6|rppsfl&f{V4* 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