From 6e7544e65f40cfc90a43d143fea5ffa3e57f003a Mon Sep 17 00:00:00 2001 From: Quentin Perez Date: Wed, 21 Oct 2015 17:31:54 +0200 Subject: [PATCH 1/2] Improve _cs format --- README.md | 1 + pkg/cli/x_cs.go | 32 +++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5552cd0422..92849b943e 100644 --- a/README.md +++ b/README.md @@ -1132,6 +1132,7 @@ $ scw inspect myserver | jq '.[0].public_ip.address' ### master (unreleased) +* Improve _cs format ([#223](https://github.com/scaleway/scaleway-cli/issues/223)) * Use `gotty-client` instead of `termjs-cli` * Fix: bad detection of server already started when starting a server ([#224](https://github.com/scaleway/scaleway-cli/pull/224)) - [@arianvp](https://github.com/arianvp) * Added _cs ([#180](https://github.com/scaleway/scaleway-cli/issues/180)) diff --git a/pkg/cli/x_cs.go b/pkg/cli/x_cs.go index ce0a3a16cc..d743b8c77e 100644 --- a/pkg/cli/x_cs.go +++ b/pkg/cli/x_cs.go @@ -4,7 +4,14 @@ package cli -import "fmt" +import ( + "fmt" + "strconv" + "strings" + "time" + + "github.com/scaleway/scaleway-cli/vendor/github.com/dustin/go-humanize" +) var cmdCS = &Command{ Exec: runCS, @@ -37,13 +44,28 @@ func runCS(cmd *Command, args []string) error { if err != nil { return fmt.Errorf("Unable to get your containers: %v", err) } - printRawMode(cmd.Streams().Stdout, *containers) + for _, container := range containers.Containers { + fmt.Fprintf(cmd.Streams().Stdout, "s3://%s\n", container.Name) + } return nil } - datas, err := cmd.API.GetContainerDatas(args[0]) + container := strings.Replace(args[0], "s3://", "", 1) + datas, err := cmd.API.GetContainerDatas(container) if err != nil { - return fmt.Errorf("Unable to get your data from %s: %v", args[1], err) + return fmt.Errorf("Unable to get your data from %s: %v", container, err) + } + for _, data := range datas.Container { + t, err := time.Parse(time.RFC3339, data.LastModified) + if err != nil { + return err + } + year, month, day := t.Date() + hour, minute, _ := t.Clock() + size, err := strconv.Atoi(data.Size) + if err != nil { + return err + } + fmt.Fprintf(cmd.Streams().Stdout, "%-4d-%02d-%02d %02d:%02d %8s s3://%s/%s\n", year, month, day, hour, minute, humanize.Bytes(uint64(size)), container, data.Name) } - printRawMode(cmd.Streams().Stdout, *datas) return nil } From de1e3ba83655c4b553a77503bf5141605a300f99 Mon Sep 17 00:00:00 2001 From: Quentin Perez Date: Wed, 21 Oct 2015 17:49:29 +0200 Subject: [PATCH 2/2] party -c -t -d=vendor --- pkg/scwversion/version.go | 2 +- pkg/utils/utils.go | 4 +- .../github.com/Sirupsen/logrus/CHANGELOG.md | 13 + vendor/github.com/Sirupsen/logrus/README.md | 33 +- vendor/github.com/Sirupsen/logrus/doc.go | 26 + vendor/github.com/Sirupsen/logrus/entry.go | 8 + .../github.com/Sirupsen/logrus/entry_test.go | 24 + vendor/github.com/Sirupsen/logrus/exported.go | 5 + vendor/github.com/Sirupsen/logrus/logger.go | 2 +- vendor/github.com/Sirupsen/logrus/logrus.go | 6 +- .../Sirupsen/logrus/text_formatter.go | 4 +- .../docker/docker/pkg/archive/archive.go | 186 ++-- .../docker/docker/pkg/archive/archive_test.go | 6 +- .../docker/docker/pkg/archive/archive_unix.go | 11 +- .../docker/pkg/archive/archive_windows.go | 14 +- .../docker/docker/pkg/archive/changes.go | 15 +- .../docker/pkg/archive/changes_posix_test.go | 4 +- .../docker/docker/pkg/archive/changes_test.go | 2 +- .../docker/docker/pkg/archive/changes_unix.go | 6 +- .../docker/pkg/archive/changes_windows.go | 2 +- .../docker/docker/pkg/archive/copy.go | 3 +- .../docker/docker/pkg/archive/diff.go | 87 +- .../docker/docker/pkg/archive/whiteouts.go | 23 + .../docker/docker/pkg/fileutils/fileutils.go | 12 - .../docker/pkg/fileutils/fileutils_unix.go | 22 + .../docker/pkg/fileutils/fileutils_windows.go | 7 + .../docker/docker/pkg/idtools/idtools.go | 188 ++++ .../docker/pkg/idtools/usergroupadd_linux.go | 175 ++++ .../pkg/idtools/usergroupadd_unsupported.go | 26 + .../docker/docker/pkg/ioutils/bytespipe.go | 89 ++ .../docker/pkg/ioutils/bytespipe_test.go | 141 +++ .../docker/docker/pkg/ioutils/fmt.go | 8 + .../docker/docker/pkg/ioutils/readers.go | 128 +-- .../docker/docker/pkg/ioutils/readers_test.go | 18 +- .../docker/docker/pkg/ioutils/temp_unix.go | 10 + .../docker/docker/pkg/ioutils/temp_windows.go | 18 + .../docker/docker/pkg/longpath/longpath.go | 26 + .../docker/pkg/longpath/longpath_test.go | 22 + .../docker/docker/pkg/mflag/flag.go | 44 + .../pkg/namesgenerator/names-generator.go | 159 ++- .../docker/docker/pkg/system/chtimes.go | 31 + .../docker/docker/pkg/system/chtimes_test.go | 120 +++ .../docker/pkg/system/chtimes_unix_test.go | 121 +++ .../docker/pkg/system/chtimes_windows_test.go | 114 +++ .../docker/docker/pkg/system/errors.go | 1 + .../docker/pkg/system/events_windows.go | 16 +- .../docker/docker/pkg/system/filesys.go | 8 + .../docker/pkg/system/filesys_windows.go | 18 + .../docker/docker/pkg/system/lstat.go | 4 +- .../{lstat_test.go => lstat_unix_test.go} | 2 + .../docker/docker/pkg/system/lstat_windows.go | 8 +- .../docker/docker/pkg/system/meminfo_linux.go | 5 - ...nfo_linux_test.go => meminfo_unix_test.go} | 2 + .../docker/pkg/system/meminfo_unsupported.go | 1 + .../docker/docker/pkg/system/mknod.go | 6 +- .../docker/docker/pkg/system/mknod_windows.go | 2 + .../docker/docker/pkg/system/stat.go | 27 +- .../docker/docker/pkg/system/stat_freebsd.go | 6 +- .../docker/docker/pkg/system/stat_linux.go | 12 +- .../{stat_test.go => stat_unix_test.go} | 6 +- .../docker/pkg/system/stat_unsupported.go | 6 +- .../docker/docker/pkg/system/stat_windows.go | 19 +- .../docker/docker/pkg/system/umask.go | 2 + .../docker/docker/pkg/system/umask_windows.go | 1 + .../docker/docker/pkg/system/utimes_darwin.go | 5 +- .../docker/pkg/system/utimes_freebsd.go | 6 +- .../docker/docker/pkg/system/utimes_linux.go | 12 +- .../{utimes_test.go => utimes_unix_test.go} | 2 + .../docker/pkg/system/utimes_unsupported.go | 5 +- .../docker/docker/pkg/system/xattrs_linux.go | 6 +- .../docker/pkg/system/xattrs_unsupported.go | 2 + vendor/github.com/dustin/go-humanize/comma.go | 4 +- vendor/github.com/moul/anonuuid/README.md | 18 +- .../github.com/moul/anonuuid/anonuuid_test.go | 2 +- .../moul/anonuuid/assets/anonuuid.png | Bin 48977 -> 0 bytes .../moul/anonuuid/cmd/anonuuid/main.go | 69 -- .../anonuuid/contrib/homebrew/anonuuid.rb | 33 - .../vendor/github.com/codegangsta/cli/LICENSE | 21 - .../github.com/codegangsta/cli/README.md | 308 ------ .../vendor/github.com/codegangsta/cli/app.go | 308 ------ .../github.com/codegangsta/cli/app_test.go | 869 ----------------- .../vendor/github.com/codegangsta/cli/cli.go | 40 - .../github.com/codegangsta/cli/cli_test.go | 100 -- .../github.com/codegangsta/cli/command.go | 200 ---- .../codegangsta/cli/command_test.go | 49 - .../github.com/codegangsta/cli/context.go | 388 -------- .../codegangsta/cli/context_test.go | 115 --- .../vendor/github.com/codegangsta/cli/flag.go | 497 ---------- .../github.com/codegangsta/cli/flag_test.go | 742 -------------- .../vendor/github.com/codegangsta/cli/help.go | 238 ----- .../github.com/codegangsta/cli/help_test.go | 38 - .../codegangsta/cli/helpers_test.go | 19 - .../smartystreets/assertions/collections.go | 2 +- .../smartystreets/assertions/equality.go | 2 +- .../internal/oglematchers/all_of_test.go | 4 +- .../internal/oglematchers/any_of_test.go | 4 +- .../internal/oglematchers/any_test.go | 4 +- .../internal/oglematchers/contains_test.go | 4 +- .../internal/oglematchers/deep_equals_test.go | 4 +- .../oglematchers/elements_are_test.go | 4 +- .../internal/oglematchers/equals_test.go | 4 +- .../internal/oglematchers/error_test.go | 4 +- .../oglematchers/greater_or_equal_test.go | 4 +- .../oglematchers/greater_than_test.go | 4 +- .../oglematchers/has_same_type_as_test.go | 4 +- .../internal/oglematchers/has_substr_test.go | 4 +- .../oglematchers/identical_to_test.go | 4 +- .../oglematchers/less_or_equal_test.go | 4 +- .../internal/oglematchers/less_than_test.go | 4 +- .../oglematchers/matches_regexp_test.go | 4 +- .../internal/oglematchers/not_test.go | 4 +- .../internal/oglematchers/panics_test.go | 4 +- .../internal/oglematchers/pointee_test.go | 4 +- .../internal/oglemock/controller_test.go | 6 +- .../internal/oglemock/do_all_test.go | 6 +- .../internal/oglemock/integration_test.go | 8 +- .../internal/oglemock/internal_expectation.go | 2 +- .../oglemock/internal_expectation_test.go | 6 +- .../internal/oglemock/invoke_test.go | 6 +- .../internal/oglemock/return_test.go | 6 +- .../oglemock/sample/mock_io/mock_io.go | 2 +- .../internal/oglemock/save_arg_test.go | 6 +- .../internal/ogletest/assert_aliases.go | 2 +- .../internal/ogletest/assert_that.go | 2 +- .../internal/ogletest/expect_aliases.go | 2 +- .../internal/ogletest/expect_call.go | 2 +- .../internal/ogletest/expect_that.go | 2 +- .../internal/ogletest/expect_that_test.go | 2 +- .../internal/ogletest/register_test_suite.go | 2 +- .../assertions/internal/ogletest/run_tests.go | 2 +- .../internal/ogletest/srcutil/methods_test.go | 6 +- .../assertions/internal/ogletest/test_info.go | 4 +- .../assertions/internal/reqtrace/reqtrace.go | 2 +- .../smartystreets/assertions/quantity.go | 2 +- .../smartystreets/assertions/serializer.go | 2 +- .../assertions/serializer_test.go | 2 +- .../goconvey/convey/assertions.go | 2 +- .../smartystreets/goconvey/convey/context.go | 4 +- .../smartystreets/goconvey/convey/doc.go | 2 +- .../smartystreets/goconvey/convey/init.go | 6 +- .../goconvey/convey/nilReporter.go | 2 +- .../goconvey/convey/reporting/reports.go | 2 +- .../goconvey/convey/reporting_hooks_test.go | 2 +- .../golang.org/x/net/context/context.go | 2 +- .../x/net/context/withtimeout_test.go | 2 +- vendor/github.com/moul/gotty-client/LICENSE | 22 + vendor/github.com/moul/gotty-client/Makefile | 66 ++ vendor/github.com/moul/gotty-client/README.md | 146 +++ .../github.com/moul/gotty-client/gotty-client | Bin 0 -> 8614540 bytes .../moul/gotty-client/gotty-client.go | 309 ++++++ .../github.com/Sirupsen/logrus/CHANGELOG.md | 54 ++ .../vendor/github.com/Sirupsen/logrus/LICENSE | 21 + .../github.com/Sirupsen/logrus/README.md | 356 +++++++ .../vendor/github.com/Sirupsen/logrus/doc.go | 26 + .../github.com/Sirupsen/logrus/entry.go | 264 +++++ .../github.com/Sirupsen/logrus/entry_test.go | 77 ++ .../github.com/Sirupsen/logrus/exported.go | 193 ++++ .../github.com/Sirupsen/logrus/formatter.go | 48 + .../Sirupsen/logrus/formatter_bench_test.go | 98 ++ .../github.com/Sirupsen/logrus/hook_test.go | 122 +++ .../github.com/Sirupsen/logrus/hooks.go | 34 + .../Sirupsen/logrus/json_formatter.go | 41 + .../Sirupsen/logrus/json_formatter_test.go | 120 +++ .../github.com/Sirupsen/logrus/logger.go | 206 ++++ .../github.com/Sirupsen/logrus/logrus.go | 98 ++ .../github.com/Sirupsen/logrus/logrus_test.go | 301 ++++++ .../Sirupsen/logrus/terminal_bsd.go | 9 + .../Sirupsen/logrus/terminal_linux.go | 12 + .../Sirupsen/logrus/terminal_notwindows.go | 21 + .../Sirupsen/logrus/terminal_windows.go | 27 + .../Sirupsen/logrus/text_formatter.go | 161 ++++ .../Sirupsen/logrus/text_formatter_test.go | 61 ++ .../github.com/Sirupsen/logrus/writer.go | 31 + .../github.com/gorilla/websocket/AUTHORS | 8 + .../github.com/gorilla/websocket/LICENSE | 22 + .../github.com/gorilla/websocket/README.md | 60 ++ .../gorilla/websocket/bench_test.go | 19 + .../github.com/gorilla/websocket/client.go | 269 ++++++ .../gorilla/websocket/client_server_test.go | 323 +++++++ .../gorilla/websocket/client_test.go | 64 ++ .../github.com/gorilla/websocket/conn.go | 826 ++++++++++++++++ .../github.com/gorilla/websocket/conn_test.go | 272 ++++++ .../github.com/gorilla/websocket/doc.go | 148 +++ .../github.com/gorilla/websocket/json.go | 55 ++ .../github.com/gorilla/websocket/json_test.go | 119 +++ .../github.com/gorilla/websocket/server.go | 247 +++++ .../gorilla/websocket/server_test.go | 33 + .../github.com/gorilla/websocket/util.go | 44 + .../github.com/gorilla/websocket/util_test.go | 34 + .../stretchr/testify/assert/assertions.go | 897 +++++++++++++++++ .../testify/assert/assertions_test.go | 911 ++++++++++++++++++ .../github.com/stretchr/testify/assert/doc.go | 45 + .../stretchr/testify/assert/errors.go | 10 + .../testify/assert/forward_assertions.go | 275 ++++++ .../testify/assert/forward_assertions_test.go | 537 +++++++++++ .../testify/assert/http_assertions.go | 157 +++ .../testify/assert/http_assertions_test.go | 86 ++ .../x/crypto/ssh/terminal/terminal.go | 892 +++++++++++++++++ .../x/crypto/ssh/terminal/terminal_test.go | 269 ++++++ .../golang.org/x/crypto/ssh/terminal/util.go | 128 +++ .../x/crypto/ssh/terminal/util_bsd.go | 12 + .../x/crypto/ssh/terminal/util_linux.go | 11 + .../x/crypto/ssh/terminal/util_windows.go | 174 ++++ vendor/github.com/moul/http2curl/README.md | 25 + .../runc/libcontainer/user/user.go | 39 +- .../runc/libcontainer/user/user_test.go | 36 + .../renstrom/fuzzysearch/fuzzy/fuzzy.go | 61 +- .../renstrom/fuzzysearch/fuzzy/fuzzy_test.go | 57 +- .../fuzzysearch/fuzzy/levenshtein_test.go | 12 +- .../smartystreets/assertions/README.md | 26 + .../smartystreets/assertions/collections.go | 55 ++ .../assertions/collections_test.go | 32 + .../smartystreets/assertions/equality.go | 11 +- .../smartystreets/assertions/equality_test.go | 6 +- .../smartystreets/assertions/messages.go | 7 +- .../smartystreets/assertions/strings.go | 44 + .../smartystreets/assertions/strings_test.go | 16 + .../goconvey/convey/assertions.go | 1 + .../stretchr/testify/assert/assertions.go | 46 +- .../testify/assert/assertions_test.go | 98 ++ .../github.com/stretchr/testify/assert/doc.go | 109 --- .../testify/assert/forward_assertions.go | 10 + .../testify/assert/forward_assertions_test.go | 26 + .../golang.org/x/net/context/context_test.go | 2 +- 224 files changed, 12330 insertions(+), 4659 deletions(-) create mode 100644 vendor/github.com/Sirupsen/logrus/doc.go create mode 100644 vendor/github.com/docker/docker/pkg/archive/whiteouts.go create mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go create mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go create mode 100644 vendor/github.com/docker/docker/pkg/idtools/idtools.go create mode 100644 vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go create mode 100644 vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go create mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go create mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath.go create mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath_test.go create mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes.go create mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_test.go create mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go create mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go rename vendor/github.com/docker/docker/pkg/system/{lstat_test.go => lstat_unix_test.go} (95%) rename vendor/github.com/docker/docker/pkg/system/{meminfo_linux_test.go => meminfo_unix_test.go} (97%) rename vendor/github.com/docker/docker/pkg/system/{stat_test.go => stat_unix_test.go} (88%) rename vendor/github.com/docker/docker/pkg/system/{utimes_test.go => utimes_unix_test.go} (98%) delete mode 100644 vendor/github.com/moul/anonuuid/assets/anonuuid.png delete mode 100644 vendor/github.com/moul/anonuuid/cmd/anonuuid/main.go delete mode 100644 vendor/github.com/moul/anonuuid/contrib/homebrew/anonuuid.rb delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/LICENSE delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/README.md delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help_test.go delete mode 100644 vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/helpers_test.go create mode 100644 vendor/github.com/moul/gotty-client/LICENSE create mode 100644 vendor/github.com/moul/gotty-client/Makefile create mode 100644 vendor/github.com/moul/gotty-client/README.md create mode 100755 vendor/github.com/moul/gotty-client/gotty-client create mode 100644 vendor/github.com/moul/gotty-client/gotty-client.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/CHANGELOG.md create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/LICENSE create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/README.md create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/doc.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/entry.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/entry_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/exported.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/formatter.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/formatter_bench_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/hook_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/hooks.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/json_formatter.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/json_formatter_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/logger.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/logrus.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/logrus_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/terminal_bsd.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/terminal_linux.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/terminal_windows.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/text_formatter.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/text_formatter_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/Sirupsen/logrus/writer.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/AUTHORS create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/LICENSE create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/README.md create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/bench_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/client.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/client_server_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/client_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/conn.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/conn_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/doc.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/json.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/json_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/server.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/server_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/util.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/gorilla/websocket/util_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/assertions.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/assertions_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/doc.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/errors.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/forward_assertions.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/http_assertions.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/github.com/stretchr/testify/assert/http_assertions_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/terminal.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/util.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go create mode 100644 vendor/github.com/moul/gotty-client/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go diff --git a/pkg/scwversion/version.go b/pkg/scwversion/version.go index dd28b37eb1..243896962b 100644 --- a/pkg/scwversion/version.go +++ b/pkg/scwversion/version.go @@ -1,6 +1,6 @@ package scwversion var ( - VERSION string + VERSION string GITCOMMIT string ) diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 6b2bf76ddc..7cac979d9d 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -21,10 +21,10 @@ import ( "strings" "time" - "github.com/Sirupsen/logrus" - "github.com/moul/gotty-client" "github.com/scaleway/scaleway-cli/pkg/sshcommand" + "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" log "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/gotty-client" ) // SpawnRedirection is used to redirects the fluxes diff --git a/vendor/github.com/Sirupsen/logrus/CHANGELOG.md b/vendor/github.com/Sirupsen/logrus/CHANGELOG.md index b1fe4b62cc..ce45d541a8 100644 --- a/vendor/github.com/Sirupsen/logrus/CHANGELOG.md +++ b/vendor/github.com/Sirupsen/logrus/CHANGELOG.md @@ -1,3 +1,16 @@ +# 0.9.0 (Unreleased) + +* logrus/text_formatter: don't emit empty msg +* logrus/hooks/airbrake: move out of main repository +* logrus/hooks/sentry: move out of main repository +* logrus/hooks/papertrail: move out of main repository + +# 0.8.7 + +* logrus/core: fix possible race (#216) +* logrus/doc: small typo fixes and doc improvements + + # 0.8.6 * hooks/raven: allow passing an initialized client diff --git a/vendor/github.com/Sirupsen/logrus/README.md b/vendor/github.com/Sirupsen/logrus/README.md index bd9ffb6eda..996c376593 100644 --- a/vendor/github.com/Sirupsen/logrus/README.md +++ b/vendor/github.com/Sirupsen/logrus/README.md @@ -75,17 +75,12 @@ package main import ( "os" log "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/hooks/airbrake" ) func init() { // Log as JSON instead of the default ASCII formatter. log.SetFormatter(&log.JSONFormatter{}) - // Use the Airbrake hook to report errors that have Error severity or above to - // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development")) - // Output to stderr instead of stdout, could also be a file. log.SetOutput(os.Stderr) @@ -182,13 +177,16 @@ Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in ```go import ( log "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/hooks/airbrake" + "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "aibrake" logrus_syslog "github.com/Sirupsen/logrus/hooks/syslog" "log/syslog" ) func init() { - log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development")) + + // Use the Airbrake hook to report errors that have Error severity or above to + // an exception tracker. You can create custom hooks, see the Hooks section. + log.AddHook(airbrake.NewHook(123, "xyz", "production")) hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") if err != nil { @@ -198,26 +196,29 @@ func init() { } } ``` - +Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). | Hook | Description | | ----- | ----------- | -| [Airbrake](https://github.com/Sirupsen/logrus/blob/master/hooks/airbrake/airbrake.go) | Send errors to an exception tracking service compatible with the Airbrake API. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. | -| [Papertrail](https://github.com/Sirupsen/logrus/blob/master/hooks/papertrail/papertrail.go) | Send errors to the Papertrail hosted logging service via UDP. | +| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. | +| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. | +| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. | | [Syslog](https://github.com/Sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. | | [BugSnag](https://github.com/Sirupsen/logrus/blob/master/hooks/bugsnag/bugsnag.go) | Send errors to the Bugsnag exception tracking service. | -| [Sentry](https://github.com/Sirupsen/logrus/blob/master/hooks/sentry/sentry.go) | Send errors to the Sentry error logging and aggregation service. | +| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. | | [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. | | [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) | | [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. | | [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` | -| [Graylog](https://github.com/gemnasium/logrus-hooks/tree/master/graylog) | Hook for logging to [Graylog](http://graylog2.org/) | +| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) | | [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) | | [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem | | [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger | | [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail | | [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar | | [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd | +| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb | +| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb | #### Level logging @@ -273,7 +274,7 @@ init() { // do something here to set environment depending on an environment variable // or command-line flag if Environment == "production" { - log.SetFormatter(&logrus.JSONFormatter{}) + log.SetFormatter(&log.JSONFormatter{}) } else { // The TextFormatter is default, you don't actually have to do this. log.SetFormatter(&log.TextFormatter{}) @@ -295,10 +296,10 @@ The built-in logging formatters are: field to `true`. To force no colored output even if there is a TTY set the `DisableColors` field to `true` * `logrus.JSONFormatter`. Logs fields as JSON. -* `logrus_logstash.LogstashFormatter`. Logs fields as Logstash Events (http://logstash.net). +* `logrus/formatters/logstash.LogstashFormatter`. Logs fields as [Logstash](http://logstash.net) Events. ```go - logrus.SetFormatter(&logrus_logstash.LogstashFormatter{Type: “application_name"}) + logrus.SetFormatter(&logstash.LogstashFormatter{Type: “application_name"}) ``` Third party logging formatters: @@ -316,7 +317,7 @@ type MyJSONFormatter struct { log.SetFormatter(new(MyJSONFormatter)) -func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { +func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { // Note this doesn't include Time, Level and Message which are available on // the Entry. Consult `godoc` on information about those fields or read the // source of the official loggers. diff --git a/vendor/github.com/Sirupsen/logrus/doc.go b/vendor/github.com/Sirupsen/logrus/doc.go new file mode 100644 index 0000000000..dddd5f877b --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/doc.go @@ -0,0 +1,26 @@ +/* +Package logrus is a structured logger for Go, completely API compatible with the standard library logger. + + +The simplest way to use Logrus is simply the package-level exported logger: + + package main + + import ( + log "github.com/Sirupsen/logrus" + ) + + func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "number": 1, + "size": 10, + }).Info("A walrus appears") + } + +Output: + time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 + +For a full guide visit https://github.com/Sirupsen/logrus +*/ +package logrus diff --git a/vendor/github.com/Sirupsen/logrus/entry.go b/vendor/github.com/Sirupsen/logrus/entry.go index 04673a075d..9ae900bc5e 100644 --- a/vendor/github.com/Sirupsen/logrus/entry.go +++ b/vendor/github.com/Sirupsen/logrus/entry.go @@ -8,6 +8,9 @@ import ( "time" ) +// Defines the key when adding errors using WithError. +var ErrorKey = "error" + // An entry is the final or intermediate Logrus logging entry. It contains all // the fields passed with WithField{,s}. It's finally logged when Debug, Info, // Warn, Error, Fatal or Panic is called on it. These objects can be reused and @@ -53,6 +56,11 @@ func (entry *Entry) String() (string, error) { return reader.String(), err } +// Add an error as single field (using the key defined in ErrorKey) to the Entry. +func (entry *Entry) WithError(err error) *Entry { + return entry.WithField(ErrorKey, err) +} + // Add a single field to the Entry. func (entry *Entry) WithField(key string, value interface{}) *Entry { return entry.WithFields(Fields{key: value}) diff --git a/vendor/github.com/Sirupsen/logrus/entry_test.go b/vendor/github.com/Sirupsen/logrus/entry_test.go index 41f5ddd3e0..41cea32bba 100644 --- a/vendor/github.com/Sirupsen/logrus/entry_test.go +++ b/vendor/github.com/Sirupsen/logrus/entry_test.go @@ -8,6 +8,30 @@ import ( "github.com/scaleway/scaleway-cli/vendor/github.com/stretchr/testify/assert" ) +func TestEntryWithError(t *testing.T) { + + assert := assert.New(t) + + defer func() { + ErrorKey = "error" + }() + + err := fmt.Errorf("kaboom at layer %d", 4711) + + assert.Equal(err, WithError(err).Data["error"]) + + logger := New() + logger.Out = &bytes.Buffer{} + entry := NewEntry(logger) + + assert.Equal(err, entry.WithError(err).Data["error"]) + + ErrorKey = "err" + + assert.Equal(err, entry.WithError(err).Data["err"]) + +} + func TestEntryPanicln(t *testing.T) { errBoom := fmt.Errorf("boom time") diff --git a/vendor/github.com/Sirupsen/logrus/exported.go b/vendor/github.com/Sirupsen/logrus/exported.go index a67e1b802d..9a0120ac1d 100644 --- a/vendor/github.com/Sirupsen/logrus/exported.go +++ b/vendor/github.com/Sirupsen/logrus/exported.go @@ -48,6 +48,11 @@ func AddHook(hook Hook) { std.Hooks.Add(hook) } +// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. +func WithError(err error) *Entry { + return std.WithField(ErrorKey, err) +} + // WithField creates an entry from the standard logger and adds a field to // it. If you want multiple fields, use `WithFields`. // diff --git a/vendor/github.com/Sirupsen/logrus/logger.go b/vendor/github.com/Sirupsen/logrus/logger.go index dd99759315..fd9804c64c 100644 --- a/vendor/github.com/Sirupsen/logrus/logger.go +++ b/vendor/github.com/Sirupsen/logrus/logger.go @@ -53,7 +53,7 @@ func New() *Logger { // Adds a field to the log entry, note that you it doesn't log until you call // Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry. -// Ff you want multiple fields, use `WithFields`. +// If you want multiple fields, use `WithFields`. func (logger *Logger) WithField(key string, value interface{}) *Entry { return NewEntry(logger).WithField(key, value) } diff --git a/vendor/github.com/Sirupsen/logrus/logrus.go b/vendor/github.com/Sirupsen/logrus/logrus.go index 43ee12e90e..0c09fbc264 100644 --- a/vendor/github.com/Sirupsen/logrus/logrus.go +++ b/vendor/github.com/Sirupsen/logrus/logrus.go @@ -74,7 +74,11 @@ const ( ) // Won't compile if StdLogger can't be realized by a log.Logger -var _ StdLogger = &log.Logger{} +var ( + _ StdLogger = &log.Logger{} + _ StdLogger = &Entry{} + _ StdLogger = &Logger{} +) // StdLogger is what your logrus-enabled library should take, that way // it'll accept a stdlib logger and a logrus logger. There's no standard diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter.go b/vendor/github.com/Sirupsen/logrus/text_formatter.go index 17cc298484..06ef202337 100644 --- a/vendor/github.com/Sirupsen/logrus/text_formatter.go +++ b/vendor/github.com/Sirupsen/logrus/text_formatter.go @@ -84,7 +84,9 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat)) } f.appendKeyValue(b, "level", entry.Level.String()) - f.appendKeyValue(b, "msg", entry.Message) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message) + } for _, key := range keys { f.appendKeyValue(b, key, entry.Data[key]) } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive.go b/vendor/github.com/docker/docker/pkg/archive/archive.go index e4bdc08aec..6f45980183 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive.go @@ -19,6 +19,8 @@ import ( "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/fileutils" + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/idtools" + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/ioutils" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/pools" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/promise" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" @@ -41,6 +43,8 @@ type ( ExcludePatterns []string Compression Compression NoLchown bool + UIDMaps []idtools.IDMap + GIDMaps []idtools.IDMap ChownOpts *TarChownOptions IncludeSourceDir bool // When unpacking, specifies whether overwriting a directory with a @@ -52,9 +56,13 @@ type ( } // Archiver allows the reuse of most utility functions of this package - // with a pluggable Untar function. + // with a pluggable Untar function. Also, to facilitate the passing of + // specific id mappings for untar, an archiver can be created with maps + // which will then be passed to Untar operations Archiver struct { - Untar func(io.Reader, string, *TarOptions) error + Untar func(io.Reader, string, *TarOptions) error + UIDMaps []idtools.IDMap + GIDMaps []idtools.IDMap } // breakoutError is used to differentiate errors related to breaking out @@ -66,7 +74,7 @@ type ( var ( // ErrNotImplemented is the error message of function not implemented. ErrNotImplemented = errors.New("Function not implemented") - defaultArchiver = &Archiver{Untar} + defaultArchiver = &Archiver{Untar: Untar, UIDMaps: nil, GIDMaps: nil} ) const ( @@ -109,10 +117,10 @@ func DetectCompression(source []byte) Compression { return Uncompressed } -func xzDecompress(archive io.Reader) (io.ReadCloser, error) { +func xzDecompress(archive io.Reader) (io.ReadCloser, <-chan struct{}, error) { args := []string{"xz", "-d", "-c", "-q"} - return CmdStream(exec.Command(args[0], args[1:]...), archive) + return cmdStream(exec.Command(args[0], args[1:]...), archive) } // DecompressStream decompress the archive and returns a ReaderCloser with the decompressed archive. @@ -141,12 +149,15 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) { readBufWrapper := p.NewReadCloserWrapper(buf, bz2Reader) return readBufWrapper, nil case Xz: - xzReader, err := xzDecompress(buf) + xzReader, chdone, err := xzDecompress(buf) if err != nil { return nil, err } readBufWrapper := p.NewReadCloserWrapper(buf, xzReader) - return readBufWrapper, nil + return ioutils.NewReadCloserWrapper(readBufWrapper, func() error { + <-chdone + return readBufWrapper.Close() + }), nil default: return nil, fmt.Errorf("Unsupported compression format %s", (&compression).Extension()) } @@ -194,6 +205,8 @@ type tarAppender struct { // for hardlink mapping SeenFiles map[uint64]string + UIDMaps []idtools.IDMap + GIDMaps []idtools.IDMap } // canonicalTarName provides a platform-independent and consistent posix-style @@ -261,6 +274,25 @@ func (ta *tarAppender) addTarFile(path, name string) error { hdr.Xattrs["security.capability"] = string(capability) } + //handle re-mapping container ID mappings back to host ID mappings before + //writing tar headers/files + if ta.UIDMaps != nil || ta.GIDMaps != nil { + uid, gid, err := getFileUIDGID(fi.Sys()) + if err != nil { + return err + } + xUID, err := idtools.ToContainer(uid, ta.UIDMaps) + if err != nil { + return err + } + xGID, err := idtools.ToContainer(gid, ta.GIDMaps) + if err != nil { + return err + } + hdr.Uid = xUID + hdr.Gid = xGID + } + if err := ta.TarWriter.WriteHeader(hdr); err != nil { return err } @@ -375,19 +407,19 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L return err } - ts := []syscall.Timespec{timeToTimespec(hdr.AccessTime), timeToTimespec(hdr.ModTime)} - // syscall.UtimesNano doesn't support a NOFOLLOW flag atm + // system.Chtimes doesn't support a NOFOLLOW flag atm if hdr.Typeflag == tar.TypeLink { if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) { - if err := system.UtimesNano(path, ts); err != nil && err != system.ErrNotSupportedPlatform { + if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return err } } } else if hdr.Typeflag != tar.TypeSymlink { - if err := system.UtimesNano(path, ts); err != nil && err != system.ErrNotSupportedPlatform { + if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return err } } else { + ts := []syscall.Timespec{timeToTimespec(hdr.AccessTime), timeToTimespec(hdr.ModTime)} if err := system.LUtimesNano(path, ts); err != nil && err != system.ErrNotSupportedPlatform { return err } @@ -427,6 +459,8 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error) TarWriter: tar.NewWriter(compressWriter), Buffer: pools.BufioWriter32KPool.Get(nil), SeenFiles: make(map[uint64]string), + UIDMaps: options.UIDMaps, + GIDMaps: options.GIDMaps, } defer func() { @@ -554,6 +588,10 @@ func Unpack(decompressedArchive io.Reader, dest string, options *TarOptions) err defer pools.BufioReader32KPool.Put(trBuf) var dirs []*tar.Header + remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(options.UIDMaps, options.GIDMaps) + if err != nil { + return err + } // Iterate through the files in the archive. loop: @@ -631,6 +669,28 @@ loop: } trBuf.Reset(tr) + // if the options contain a uid & gid maps, convert header uid/gid + // entries using the maps such that lchown sets the proper mapped + // uid/gid after writing the file. We only perform this mapping if + // the file isn't already owned by the remapped root UID or GID, as + // that specific uid/gid has no mapping from container -> host, and + // those files already have the proper ownership for inside the + // container. + if hdr.Uid != remappedRootUID { + xUID, err := idtools.ToHost(hdr.Uid, options.UIDMaps) + if err != nil { + return err + } + hdr.Uid = xUID + } + if hdr.Gid != remappedRootGID { + xGID, err := idtools.ToHost(hdr.Gid, options.GIDMaps) + if err != nil { + return err + } + hdr.Gid = xGID + } + if err := createTarFile(path, dest, hdr, trBuf, !options.NoLchown, options.ChownOpts); err != nil { return err } @@ -644,8 +704,8 @@ loop: for _, hdr := range dirs { path := filepath.Join(dest, hdr.Name) - ts := []syscall.Timespec{timeToTimespec(hdr.AccessTime), timeToTimespec(hdr.ModTime)} - if err := syscall.UtimesNano(path, ts); err != nil { + + if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return err } } @@ -703,7 +763,15 @@ func (archiver *Archiver) TarUntar(src, dst string) error { return err } defer archive.Close() - return archiver.Untar(archive, dst, nil) + + var options *TarOptions + if archiver.UIDMaps != nil || archiver.GIDMaps != nil { + options = &TarOptions{ + UIDMaps: archiver.UIDMaps, + GIDMaps: archiver.GIDMaps, + } + } + return archiver.Untar(archive, dst, options) } // TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other. @@ -719,7 +787,14 @@ func (archiver *Archiver) UntarPath(src, dst string) error { return err } defer archive.Close() - if err := archiver.Untar(archive, dst, nil); err != nil { + var options *TarOptions + if archiver.UIDMaps != nil || archiver.GIDMaps != nil { + options = &TarOptions{ + UIDMaps: archiver.UIDMaps, + GIDMaps: archiver.GIDMaps, + } + } + if err := archiver.Untar(archive, dst, options); err != nil { return err } return nil @@ -801,6 +876,28 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { hdr.Name = filepath.Base(dst) hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode))) + remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(archiver.UIDMaps, archiver.GIDMaps) + if err != nil { + return err + } + + // only perform mapping if the file being copied isn't already owned by the + // uid or gid of the remapped root in the container + if remappedRootUID != hdr.Uid { + xUID, err := idtools.ToHost(hdr.Uid, archiver.UIDMaps) + if err != nil { + return err + } + hdr.Uid = xUID + } + if remappedRootGID != hdr.Gid { + xGID, err := idtools.ToHost(hdr.Gid, archiver.GIDMaps) + if err != nil { + return err + } + hdr.Gid = xGID + } + tw := tar.NewWriter(w) defer tw.Close() if err := tw.WriteHeader(hdr); err != nil { @@ -816,6 +913,7 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { err = er } }() + return archiver.Untar(r, filepath.Dir(dst), nil) } @@ -831,57 +929,33 @@ func CopyFileWithTar(src, dst string) (err error) { return defaultArchiver.CopyFileWithTar(src, dst) } -// CmdStream executes a command, and returns its stdout as a stream. +// cmdStream executes a command, and returns its stdout as a stream. // If the command fails to run or doesn't complete successfully, an error // will be returned, including anything written on stderr. -func CmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, error) { - if input != nil { - stdin, err := cmd.StdinPipe() - if err != nil { - return nil, err - } - // Write stdin if any - go func() { - io.Copy(stdin, input) - stdin.Close() - }() - } - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, err - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, err - } +func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, <-chan struct{}, error) { + chdone := make(chan struct{}) + cmd.Stdin = input pipeR, pipeW := io.Pipe() - errChan := make(chan []byte) - // Collect stderr, we will use it in case of an error - go func() { - errText, e := ioutil.ReadAll(stderr) - if e != nil { - errText = []byte("(...couldn't fetch stderr: " + e.Error() + ")") - } - errChan <- errText - }() + cmd.Stdout = pipeW + var errBuf bytes.Buffer + cmd.Stderr = &errBuf + + // Run the command and return the pipe + if err := cmd.Start(); err != nil { + return nil, nil, err + } + // Copy stdout to the returned pipe go func() { - _, err := io.Copy(pipeW, stdout) - if err != nil { - pipeW.CloseWithError(err) - } - errText := <-errChan if err := cmd.Wait(); err != nil { - pipeW.CloseWithError(fmt.Errorf("%s: %s", err, errText)) + pipeW.CloseWithError(fmt.Errorf("%s: %s", err, errBuf.String())) } else { pipeW.Close() } + close(chdone) }() - // Run the command and return the pipe - if err := cmd.Start(); err != nil { - return nil, err - } - return pipeR, nil + + return pipeR, chdone, nil } // NewTempArchive reads the content of src into a temporary file, and returns the contents diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_test.go b/vendor/github.com/docker/docker/pkg/archive/archive_test.go index 37f031eadc..dcffe20a31 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_test.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_test.go @@ -160,7 +160,7 @@ func TestExtensionXz(t *testing.T) { func TestCmdStreamLargeStderr(t *testing.T) { cmd := exec.Command("/bin/sh", "-c", "dd if=/dev/zero bs=1k count=1000 of=/dev/stderr; echo hello") - out, err := CmdStream(cmd, nil) + out, _, err := cmdStream(cmd, nil) if err != nil { t.Fatalf("Failed to start command: %s", err) } @@ -181,7 +181,7 @@ func TestCmdStreamLargeStderr(t *testing.T) { func TestCmdStreamBad(t *testing.T) { badCmd := exec.Command("/bin/sh", "-c", "echo hello; echo >&2 error couldn\\'t reverse the phase pulser; exit 1") - out, err := CmdStream(badCmd, nil) + out, _, err := cmdStream(badCmd, nil) if err != nil { t.Fatalf("Failed to start command: %s", err) } @@ -196,7 +196,7 @@ func TestCmdStreamBad(t *testing.T) { func TestCmdStreamGood(t *testing.T) { cmd := exec.Command("/bin/sh", "-c", "echo hello; exit 0") - out, err := CmdStream(cmd, nil) + out, _, err := cmdStream(cmd, nil) if err != nil { t.Fatal(err) } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go index 8405479f7b..a74c593e1c 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go @@ -51,7 +51,7 @@ func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, st nlink = uint32(s.Nlink) inode = uint64(s.Ino) - // Currently go does not fil in the major/minors + // Currently go does not fill in the major/minors if s.Mode&syscall.S_IFBLK != 0 || s.Mode&syscall.S_IFCHR != 0 { hdr.Devmajor = int64(major(uint64(s.Rdev))) @@ -61,6 +61,15 @@ func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, st return } +func getFileUIDGID(stat interface{}) (int, int, error) { + s, ok := stat.(*syscall.Stat_t) + + if !ok { + return -1, -1, errors.New("cannot convert stat value to syscall.Stat_t") + } + return int(s.Uid), int(s.Gid), nil +} + func major(device uint64) uint64 { return (device >> 8) & 0xfff } diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go index 2500785667..7b90218a97 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go @@ -8,15 +8,14 @@ import ( "os" "path/filepath" "strings" + + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/longpath" ) // fixVolumePathPrefix does platform specific processing to ensure that if // the path being passed in is not in a volume path format, convert it to one. func fixVolumePathPrefix(srcPath string) string { - if !strings.HasPrefix(srcPath, `\\?\`) { - srcPath = `\\?\` + srcPath - } - return srcPath + return longpath.AddPrefix(srcPath) } // getWalkRoot calculates the root path when performing a TarWithOptions. @@ -25,7 +24,7 @@ func getWalkRoot(srcPath string, include string) string { return filepath.Join(srcPath, include) } -// canonicalTarNameForPath returns platform-specific filepath +// CanonicalTarNameForPath returns platform-specific filepath // to canonical posix-style path for tar archival. p is relative // path. func CanonicalTarNameForPath(p string) (string, error) { @@ -64,3 +63,8 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { return nil } + +func getFileUIDGID(stat interface{}) (int, int, error) { + // no notion of file ownership mapping yet on Windows + return 0, 0, nil +} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes.go b/vendor/github.com/docker/docker/pkg/archive/changes.go index 1be70fd439..ed0fe80761 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes.go @@ -14,6 +14,7 @@ import ( "time" "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/idtools" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/pools" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" ) @@ -102,7 +103,7 @@ func Changes(layers []string, rw string) ([]Change, error) { } // Skip AUFS metadata - if matched, err := filepath.Match(string(os.PathSeparator)+".wh..wh.*", path); err != nil || matched { + if matched, err := filepath.Match(string(os.PathSeparator)+WhiteoutMetaPrefix+"*", path); err != nil || matched { return err } @@ -113,8 +114,8 @@ func Changes(layers []string, rw string) ([]Change, error) { // Find out what kind of modification happened file := filepath.Base(path) // If there is a whiteout, then the file was removed - if strings.HasPrefix(file, ".wh.") { - originalFile := file[len(".wh."):] + if strings.HasPrefix(file, WhiteoutPrefix) { + originalFile := file[len(WhiteoutPrefix):] change.Path = filepath.Join(filepath.Dir(path), originalFile) change.Kind = ChangeDelete } else { @@ -173,7 +174,7 @@ func Changes(layers []string, rw string) ([]Change, error) { type FileInfo struct { parent *FileInfo name string - stat *system.Stat_t + stat *system.StatT children map[string]*FileInfo capability []byte added bool @@ -341,13 +342,15 @@ func ChangesSize(newDir string, changes []Change) int64 { } // ExportChanges produces an Archive from the provided changes, relative to dir. -func ExportChanges(dir string, changes []Change) (Archive, error) { +func ExportChanges(dir string, changes []Change, uidMaps, gidMaps []idtools.IDMap) (Archive, error) { reader, writer := io.Pipe() go func() { ta := &tarAppender{ TarWriter: tar.NewWriter(writer), Buffer: pools.BufioWriter32KPool.Get(nil), SeenFiles: make(map[uint64]string), + UIDMaps: uidMaps, + GIDMaps: gidMaps, } // this buffer is needed for the duration of this piped stream defer pools.BufioWriter32KPool.Put(ta.Buffer) @@ -362,7 +365,7 @@ func ExportChanges(dir string, changes []Change) (Archive, error) { if change.Kind == ChangeDelete { whiteOutDir := filepath.Dir(change.Path) whiteOutBase := filepath.Base(change.Path) - whiteOut := filepath.Join(whiteOutDir, ".wh."+whiteOutBase) + whiteOut := filepath.Join(whiteOutDir, WhiteoutPrefix+whiteOutBase) timestamp := time.Now() hdr := &tar.Header{ Name: whiteOut[1:], diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go b/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go index 9d528e614c..5a3282b5a8 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go @@ -61,7 +61,7 @@ func TestHardLinkOrder(t *testing.T) { sort.Sort(changesByPath(changes)) // ExportChanges - ar, err := ExportChanges(dest, changes) + ar, err := ExportChanges(dest, changes, nil, nil) if err != nil { t.Fatal(err) } @@ -73,7 +73,7 @@ func TestHardLinkOrder(t *testing.T) { // reverse sort sort.Sort(sort.Reverse(changesByPath(changes))) // ExportChanges - arRev, err := ExportChanges(dest, changes) + arRev, err := ExportChanges(dest, changes, nil, nil) if err != nil { t.Fatal(err) } diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_test.go b/vendor/github.com/docker/docker/pkg/archive/changes_test.go index 509bdb2e6d..afbb0b9757 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes_test.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes_test.go @@ -410,7 +410,7 @@ func TestApplyLayer(t *testing.T) { t.Fatal(err) } - layer, err := ExportChanges(dst, changes) + layer, err := ExportChanges(dst, changes, nil, nil) if err != nil { t.Fatal(err) } diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_unix.go b/vendor/github.com/docker/docker/pkg/archive/changes_unix.go index cb31f20608..f89e802b58 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes_unix.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes_unix.go @@ -8,11 +8,11 @@ import ( "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" ) -func statDifferent(oldStat *system.Stat_t, newStat *system.Stat_t) bool { +func statDifferent(oldStat *system.StatT, newStat *system.StatT) bool { // Don't look at size for dirs, its not a good measure of change if oldStat.Mode() != newStat.Mode() || - oldStat.Uid() != newStat.Uid() || - oldStat.Gid() != newStat.Gid() || + oldStat.UID() != newStat.UID() || + oldStat.GID() != newStat.GID() || oldStat.Rdev() != newStat.Rdev() || // Don't look at size for dirs, its not a good measure of change (oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR && diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_windows.go b/vendor/github.com/docker/docker/pkg/archive/changes_windows.go index 35a0358bd1..c70da894ab 100644 --- a/vendor/github.com/docker/docker/pkg/archive/changes_windows.go +++ b/vendor/github.com/docker/docker/pkg/archive/changes_windows.go @@ -4,7 +4,7 @@ import ( "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" ) -func statDifferent(oldStat *system.Stat_t, newStat *system.Stat_t) bool { +func statDifferent(oldStat *system.StatT, newStat *system.StatT) bool { // Don't look at size for dirs, its not a good measure of change if oldStat.ModTime() != newStat.ModTime() || diff --git a/vendor/github.com/docker/docker/pkg/archive/copy.go b/vendor/github.com/docker/docker/pkg/archive/copy.go index f3511f10a6..2240ad3da3 100644 --- a/vendor/github.com/docker/docker/pkg/archive/copy.go +++ b/vendor/github.com/docker/docker/pkg/archive/copy.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" ) // Errors used or returned by this file. @@ -210,7 +211,7 @@ func CopyInfoDestinationPath(path string) (info CopyInfo, err error) { return CopyInfo{}, err } - if !filepath.IsAbs(linkTarget) { + if !system.IsAbs(linkTarget) { // Join with the parent directory. dstParent, _ := SplitPathDirEntry(path) linkTarget = filepath.Join(dstParent, linkTarget) diff --git a/vendor/github.com/docker/docker/pkg/archive/diff.go b/vendor/github.com/docker/docker/pkg/archive/diff.go index a1583e0729..3833a8f84b 100644 --- a/vendor/github.com/docker/docker/pkg/archive/diff.go +++ b/vendor/github.com/docker/docker/pkg/archive/diff.go @@ -9,9 +9,9 @@ import ( "path/filepath" "runtime" "strings" - "syscall" "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/idtools" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/pools" "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" ) @@ -19,16 +19,30 @@ import ( // UnpackLayer unpack `layer` to a `dest`. The stream `layer` can be // compressed or uncompressed. // Returns the size in bytes of the contents of the layer. -func UnpackLayer(dest string, layer Reader) (size int64, err error) { +func UnpackLayer(dest string, layer Reader, options *TarOptions) (size int64, err error) { tr := tar.NewReader(layer) trBuf := pools.BufioReader32KPool.Get(tr) defer pools.BufioReader32KPool.Put(trBuf) var dirs []*tar.Header + if options == nil { + options = &TarOptions{} + } + if options.ExcludePatterns == nil { + options.ExcludePatterns = []string{} + } + remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(options.UIDMaps, options.GIDMaps) + if err != nil { + return 0, err + } + aufsTempdir := "" aufsHardlinks := make(map[string]*tar.Header) + if options == nil { + options = &TarOptions{} + } // Iterate through the files in the archive. for { hdr, err := tr.Next() @@ -83,11 +97,11 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { } // Skip AUFS metadata dirs - if strings.HasPrefix(hdr.Name, ".wh..wh.") { + if strings.HasPrefix(hdr.Name, WhiteoutMetaPrefix) { // Regular files inside /.wh..wh.plnk can be used as hardlink targets // We don't want this directory, but we need the files in them so that // such hardlinks can be resolved. - if strings.HasPrefix(hdr.Name, ".wh..wh.plnk") && hdr.Typeflag == tar.TypeReg { + if strings.HasPrefix(hdr.Name, WhiteoutLinkDir) && hdr.Typeflag == tar.TypeReg { basename := filepath.Base(hdr.Name) aufsHardlinks[basename] = hdr if aufsTempdir == "" { @@ -100,7 +114,10 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { return 0, err } } - continue + + if hdr.Name != WhiteoutOpaqueDir { + continue + } } path := filepath.Join(dest, hdr.Name) rel, err := filepath.Rel(dest, path) @@ -114,11 +131,25 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { } base := filepath.Base(path) - if strings.HasPrefix(base, ".wh.") { - originalBase := base[len(".wh."):] - originalPath := filepath.Join(filepath.Dir(path), originalBase) - if err := os.RemoveAll(originalPath); err != nil { - return 0, err + if strings.HasPrefix(base, WhiteoutPrefix) { + dir := filepath.Dir(path) + if base == WhiteoutOpaqueDir { + fi, err := os.Lstat(dir) + if err != nil && !os.IsNotExist(err) { + return 0, err + } + if err := os.RemoveAll(dir); err != nil { + return 0, err + } + if err := os.Mkdir(dir, fi.Mode()&os.ModePerm); err != nil { + return 0, err + } + } else { + originalBase := base[len(WhiteoutPrefix):] + originalPath := filepath.Join(dir, originalBase) + if err := os.RemoveAll(originalPath); err != nil { + return 0, err + } } } else { // If path exits we almost always just want to remove and replace it. @@ -139,7 +170,7 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { // Hard links into /.wh..wh.plnk don't work, as we don't extract that directory, so // we manually retarget these into the temporary files we extracted them into - if hdr.Typeflag == tar.TypeLink && strings.HasPrefix(filepath.Clean(hdr.Linkname), ".wh..wh.plnk") { + if hdr.Typeflag == tar.TypeLink && strings.HasPrefix(filepath.Clean(hdr.Linkname), WhiteoutLinkDir) { linkBasename := filepath.Base(hdr.Linkname) srcHdr = aufsHardlinks[linkBasename] if srcHdr == nil { @@ -153,6 +184,27 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { srcData = tmpFile } + // if the options contain a uid & gid maps, convert header uid/gid + // entries using the maps such that lchown sets the proper mapped + // uid/gid after writing the file. We only perform this mapping if + // the file isn't already owned by the remapped root UID or GID, as + // that specific uid/gid has no mapping from container -> host, and + // those files already have the proper ownership for inside the + // container. + if srcHdr.Uid != remappedRootUID { + xUID, err := idtools.ToHost(srcHdr.Uid, options.UIDMaps) + if err != nil { + return 0, err + } + srcHdr.Uid = xUID + } + if srcHdr.Gid != remappedRootGID { + xGID, err := idtools.ToHost(srcHdr.Gid, options.GIDMaps) + if err != nil { + return 0, err + } + srcHdr.Gid = xGID + } if err := createTarFile(path, dest, srcHdr, srcData, true, nil); err != nil { return 0, err } @@ -167,8 +219,7 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { for _, hdr := range dirs { path := filepath.Join(dest, hdr.Name) - ts := []syscall.Timespec{timeToTimespec(hdr.AccessTime), timeToTimespec(hdr.ModTime)} - if err := syscall.UtimesNano(path, ts); err != nil { + if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return 0, err } } @@ -181,19 +232,19 @@ func UnpackLayer(dest string, layer Reader) (size int64, err error) { // compressed or uncompressed. // Returns the size in bytes of the contents of the layer. func ApplyLayer(dest string, layer Reader) (int64, error) { - return applyLayerHandler(dest, layer, true) + return applyLayerHandler(dest, layer, &TarOptions{}, true) } // ApplyUncompressedLayer parses a diff in the standard layer format from // `layer`, and applies it to the directory `dest`. The stream `layer` // can only be uncompressed. // Returns the size in bytes of the contents of the layer. -func ApplyUncompressedLayer(dest string, layer Reader) (int64, error) { - return applyLayerHandler(dest, layer, false) +func ApplyUncompressedLayer(dest string, layer Reader, options *TarOptions) (int64, error) { + return applyLayerHandler(dest, layer, options, false) } // do the bulk load of ApplyLayer, but allow for not calling DecompressStream -func applyLayerHandler(dest string, layer Reader, decompress bool) (int64, error) { +func applyLayerHandler(dest string, layer Reader, options *TarOptions, decompress bool) (int64, error) { dest = filepath.Clean(dest) // We need to be able to set any perms @@ -209,5 +260,5 @@ func applyLayerHandler(dest string, layer Reader, decompress bool) (int64, error return 0, err } } - return UnpackLayer(dest, layer) + return UnpackLayer(dest, layer, options) } diff --git a/vendor/github.com/docker/docker/pkg/archive/whiteouts.go b/vendor/github.com/docker/docker/pkg/archive/whiteouts.go new file mode 100644 index 0000000000..3d9c313213 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/archive/whiteouts.go @@ -0,0 +1,23 @@ +package archive + +// Whiteouts are files with a special meaning for the layered filesystem. +// Docker uses AUFS whiteout files inside exported archives. In other +// filesystems these files are generated/handled on tar creation/extraction. + +// WhiteoutPrefix prefix means file is a whiteout. If this is followed by a +// filename this means that file has been removed from the base layer. +const WhiteoutPrefix = ".wh." + +// WhiteoutMetaPrefix prefix means whiteout has a special meaning and is not +// for remoing an actaul file. Normally these files are excluded from exported +// archives. +const WhiteoutMetaPrefix = WhiteoutPrefix + WhiteoutPrefix + +// WhiteoutLinkDir is a directory AUFS uses for storing hardlink links to other +// layers. Normally these should not go into exported archives and all changed +// hardlinks should be copied to the top layer. +const WhiteoutLinkDir = WhiteoutMetaPrefix + "plnk" + +// WhiteoutOpaqueDir file means directory has been made opaque - meaning +// readdir calls to this directory do not follow to lower layers. +const WhiteoutOpaqueDir = WhiteoutMetaPrefix + ".opq" diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go index b33e596a21..0c62fa086a 100644 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go +++ b/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -143,17 +142,6 @@ func CopyFile(src, dst string) (int64, error) { return io.Copy(df, sf) } -// GetTotalUsedFds Returns the number of used File Descriptors by -// reading it via /proc filesystem. -func GetTotalUsedFds() int { - if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { - logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) - } else { - return len(fds) - } - return -1 -} - // ReadSymlinkedDirectory returns the target directory of a symlink. // The target of the symbolic link may not be a file. func ReadSymlinkedDirectory(path string) (string, error) { diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go new file mode 100644 index 0000000000..fd2b7463ac --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go @@ -0,0 +1,22 @@ +// +build linux freebsd + +package fileutils + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus" +) + +// GetTotalUsedFds Returns the number of used File Descriptors by +// reading it via /proc filesystem. +func GetTotalUsedFds() int { + if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { + logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) + } else { + return len(fds) + } + return -1 +} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go new file mode 100644 index 0000000000..5ec21cace5 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go @@ -0,0 +1,7 @@ +package fileutils + +// GetTotalUsedFds Returns the number of used File Descriptors. Not supported +// on Windows. +func GetTotalUsedFds() int { + return -1 +} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools.go b/vendor/github.com/docker/docker/pkg/idtools/idtools.go new file mode 100644 index 0000000000..f6671403e3 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools.go @@ -0,0 +1,188 @@ +package idtools + +import ( + "bufio" + "fmt" + "os" + "sort" + "strconv" + "strings" +) + +// IDMap contains a single entry for user namespace range remapping. An array +// of IDMap entries represents the structure that will be provided to the Linux +// kernel for creating a user namespace. +type IDMap struct { + ContainerID int `json:"container_id"` + HostID int `json:"host_id"` + Size int `json:"size"` +} + +type subIDRange struct { + Start int + Length int +} + +type ranges []subIDRange + +func (e ranges) Len() int { return len(e) } +func (e ranges) Swap(i, j int) { e[i], e[j] = e[j], e[i] } +func (e ranges) Less(i, j int) bool { return e[i].Start < e[j].Start } + +const ( + subuidFileName string = "/etc/subuid" + subgidFileName string = "/etc/subgid" +) + +// MkdirAllAs creates a directory (include any along the path) and then modifies +// ownership to the requested uid/gid. If the directory already exists, this +// function will still change ownership to the requested uid/gid pair. +func MkdirAllAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { + return mkdirAs(path, mode, ownerUID, ownerGID, true) +} + +// MkdirAs creates a directory and then modifies ownership to the requested uid/gid. +// If the directory already exists, this function still changes ownership +func MkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { + return mkdirAs(path, mode, ownerUID, ownerGID, false) +} + +// GetRootUIDGID retrieves the remapped root uid/gid pair from the set of maps. +// If the maps are empty, then the root uid/gid will default to "real" 0/0 +func GetRootUIDGID(uidMap, gidMap []IDMap) (int, int, error) { + var uid, gid int + + if uidMap != nil { + xUID, err := ToHost(0, uidMap) + if err != nil { + return -1, -1, err + } + uid = xUID + } + if gidMap != nil { + xGID, err := ToHost(0, gidMap) + if err != nil { + return -1, -1, err + } + gid = xGID + } + return uid, gid, nil +} + +// ToContainer takes an id mapping, and uses it to translate a +// host ID to the remapped ID. If no map is provided, then the translation +// assumes a 1-to-1 mapping and returns the passed in id +func ToContainer(hostID int, idMap []IDMap) (int, error) { + if idMap == nil { + return hostID, nil + } + for _, m := range idMap { + if (hostID >= m.HostID) && (hostID <= (m.HostID + m.Size - 1)) { + contID := m.ContainerID + (hostID - m.HostID) + return contID, nil + } + } + return -1, fmt.Errorf("Host ID %d cannot be mapped to a container ID", hostID) +} + +// ToHost takes an id mapping and a remapped ID, and translates the +// ID to the mapped host ID. If no map is provided, then the translation +// assumes a 1-to-1 mapping and returns the passed in id # +func ToHost(contID int, idMap []IDMap) (int, error) { + if idMap == nil { + return contID, nil + } + for _, m := range idMap { + if (contID >= m.ContainerID) && (contID <= (m.ContainerID + m.Size - 1)) { + hostID := m.HostID + (contID - m.ContainerID) + return hostID, nil + } + } + return -1, fmt.Errorf("Container ID %d cannot be mapped to a host ID", contID) +} + +// CreateIDMappings takes a requested user and group name and +// using the data from /etc/sub{uid,gid} ranges, creates the +// proper uid and gid remapping ranges for that user/group pair +func CreateIDMappings(username, groupname string) ([]IDMap, []IDMap, error) { + subuidRanges, err := parseSubuid(username) + if err != nil { + return nil, nil, err + } + subgidRanges, err := parseSubgid(groupname) + if err != nil { + return nil, nil, err + } + if len(subuidRanges) == 0 { + return nil, nil, fmt.Errorf("No subuid ranges found for user %q", username) + } + if len(subgidRanges) == 0 { + return nil, nil, fmt.Errorf("No subgid ranges found for group %q", groupname) + } + + return createIDMap(subuidRanges), createIDMap(subgidRanges), nil +} + +func createIDMap(subidRanges ranges) []IDMap { + idMap := []IDMap{} + + // sort the ranges by lowest ID first + sort.Sort(subidRanges) + containerID := 0 + for _, idrange := range subidRanges { + idMap = append(idMap, IDMap{ + ContainerID: containerID, + HostID: idrange.Start, + Size: idrange.Length, + }) + containerID = containerID + idrange.Length + } + return idMap +} + +func parseSubuid(username string) (ranges, error) { + return parseSubidFile(subuidFileName, username) +} + +func parseSubgid(username string) (ranges, error) { + return parseSubidFile(subgidFileName, username) +} + +func parseSubidFile(path, username string) (ranges, error) { + var rangeList ranges + + subidFile, err := os.Open(path) + if err != nil { + return rangeList, err + } + defer subidFile.Close() + + s := bufio.NewScanner(subidFile) + for s.Scan() { + if err := s.Err(); err != nil { + return rangeList, err + } + + text := strings.TrimSpace(s.Text()) + if text == "" { + continue + } + parts := strings.Split(text, ":") + if len(parts) != 3 { + return rangeList, fmt.Errorf("Cannot parse subuid/gid information: Format not correct for %s file", path) + } + if parts[0] == username { + // return the first entry for a user; ignores potential for multiple ranges per user + startid, err := strconv.Atoi(parts[1]) + if err != nil { + return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) + } + length, err := strconv.Atoi(parts[2]) + if err != nil { + return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) + } + rangeList = append(rangeList, subIDRange{startid, length}) + } + } + return rangeList, nil +} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go new file mode 100644 index 0000000000..80d9629955 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go @@ -0,0 +1,175 @@ +package idtools + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + "syscall" + + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" +) + +// add a user and/or group to Linux /etc/passwd, /etc/group using standard +// Linux distribution commands: +// adduser --uid --shell /bin/login --no-create-home --disabled-login --ingroup +// useradd -M -u -s /bin/nologin -N -g +// addgroup --gid +// groupadd -g + +const baseUID int = 10000 +const baseGID int = 10000 +const idMAX int = 65534 + +var ( + userCommand string + groupCommand string + + cmdTemplates = map[string]string{ + "adduser": "--uid %d --shell /bin/false --no-create-home --disabled-login --ingroup %s %s", + "useradd": "-M -u %d -s /bin/false -N -g %s %s", + "addgroup": "--gid %d %s", + "groupadd": "-g %d %s", + } +) + +func init() { + // set up which commands are used for adding users/groups dependent on distro + if _, err := resolveBinary("adduser"); err == nil { + userCommand = "adduser" + } else if _, err := resolveBinary("useradd"); err == nil { + userCommand = "useradd" + } + if _, err := resolveBinary("addgroup"); err == nil { + groupCommand = "addgroup" + } else if _, err := resolveBinary("groupadd"); err == nil { + groupCommand = "groupadd" + } +} + +func resolveBinary(binname string) (string, error) { + binaryPath, err := exec.LookPath(binname) + if err != nil { + return "", err + } + resolvedPath, err := filepath.EvalSymlinks(binaryPath) + if err != nil { + return "", err + } + //only return no error if the final resolved binary basename + //matches what was searched for + if filepath.Base(resolvedPath) == binname { + return resolvedPath, nil + } + return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) +} + +// AddNamespaceRangesUser takes a name and finds an unused uid, gid pair +// and calls the appropriate helper function to add the group and then +// the user to the group in /etc/group and /etc/passwd respectively. +// This new user's /etc/sub{uid,gid} ranges will be used for user namespace +// mapping ranges in containers. +func AddNamespaceRangesUser(name string) (int, int, error) { + // Find unused uid, gid pair + uid, err := findUnusedUID(baseUID) + if err != nil { + return -1, -1, fmt.Errorf("Unable to find unused UID: %v", err) + } + gid, err := findUnusedGID(baseGID) + if err != nil { + return -1, -1, fmt.Errorf("Unable to find unused GID: %v", err) + } + + // First add the group that we will use + if err := addGroup(name, gid); err != nil { + return -1, -1, fmt.Errorf("Error adding group %q: %v", name, err) + } + // Add the user as a member of the group + if err := addUser(name, uid, name); err != nil { + return -1, -1, fmt.Errorf("Error adding user %q: %v", name, err) + } + return uid, gid, nil +} + +func addUser(userName string, uid int, groupName string) error { + + if userCommand == "" { + return fmt.Errorf("Cannot add user; no useradd/adduser binary found") + } + args := fmt.Sprintf(cmdTemplates[userCommand], uid, groupName, userName) + return execAddCmd(userCommand, args) +} + +func addGroup(groupName string, gid int) error { + + if groupCommand == "" { + return fmt.Errorf("Cannot add group; no groupadd/addgroup binary found") + } + args := fmt.Sprintf(cmdTemplates[groupCommand], gid, groupName) + // only error out if the error isn't that the group already exists + // if the group exists then our needs are already met + if err := execAddCmd(groupCommand, args); err != nil && !strings.Contains(err.Error(), "already exists") { + return err + } + return nil +} + +func execAddCmd(cmd, args string) error { + execCmd := exec.Command(cmd, strings.Split(args, " ")...) + out, err := execCmd.CombinedOutput() + if err != nil { + return fmt.Errorf("Failed to add user/group with error: %v; output: %q", err, string(out)) + } + return nil +} + +func findUnusedUID(startUID int) (int, error) { + return findUnused("passwd", startUID) +} + +func findUnusedGID(startGID int) (int, error) { + return findUnused("group", startGID) +} + +func findUnused(file string, id int) (int, error) { + for { + cmdStr := fmt.Sprintf("cat /etc/%s | cut -d: -f3 | grep '^%d$'", file, id) + cmd := exec.Command("sh", "-c", cmdStr) + if err := cmd.Run(); err != nil { + // if a non-zero return code occurs, then we know the ID was not found + // and is usable + if exiterr, ok := err.(*exec.ExitError); ok { + // The program has exited with an exit code != 0 + if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { + if status.ExitStatus() == 1 { + //no match, we can use this ID + return id, nil + } + } + } + return -1, fmt.Errorf("Error looking in /etc/%s for unused ID: %v", file, err) + } + id++ + if id > idMAX { + return -1, fmt.Errorf("Maximum id in %q reached with finding unused numeric ID", file) + } + } +} + +func mkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int, mkAll bool) error { + if mkAll { + if err := system.MkdirAll(path, mode); err != nil && !os.IsExist(err) { + return err + } + } else { + if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { + return err + } + } + // even if it existed, we will chown to change ownership as requested + if err := os.Chown(path, ownerUID, ownerGID); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go new file mode 100644 index 0000000000..5823153039 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go @@ -0,0 +1,26 @@ +// +build !linux + +package idtools + +import ( + "fmt" + "os" + + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/system" +) + +// AddNamespaceRangesUser takes a name and finds an unused uid, gid pair +// and calls the appropriate helper function to add the group and then +// the user to the group in /etc/group and /etc/passwd respectively. +func AddNamespaceRangesUser(name string) (int, int, error) { + return -1, -1, fmt.Errorf("No support for adding users or groups on this OS") +} + +// Platforms such as Windows do not support the UID/GID concept. So make this +// just a wrapper around system.MkdirAll. +func mkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int, mkAll bool) error { + if err := system.MkdirAll(path, mode); err != nil && !os.IsExist(err) { + return err + } + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go new file mode 100644 index 0000000000..932e1d1bcc --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go @@ -0,0 +1,89 @@ +package ioutils + +const maxCap = 1e6 + +// BytesPipe is io.ReadWriter which works similarly to pipe(queue). +// All written data could be read only once. Also BytesPipe is allocating +// and releasing new byte slices to adjust to current needs, so there won't be +// overgrown buffer after high load peak. +// BytesPipe isn't goroutine-safe, caller must synchronize it if needed. +type BytesPipe struct { + buf [][]byte // slice of byte-slices of buffered data + lastRead int // index in the first slice to a read point + bufLen int // length of data buffered over the slices +} + +// NewBytesPipe creates new BytesPipe, initialized by specified slice. +// If buf is nil, then it will be initialized with slice which cap is 64. +// buf will be adjusted in a way that len(buf) == 0, cap(buf) == cap(buf). +func NewBytesPipe(buf []byte) *BytesPipe { + if cap(buf) == 0 { + buf = make([]byte, 0, 64) + } + return &BytesPipe{ + buf: [][]byte{buf[:0]}, + } +} + +// Write writes p to BytesPipe. +// It can allocate new []byte slices in a process of writing. +func (bp *BytesPipe) Write(p []byte) (n int, err error) { + for { + // write data to the last buffer + b := bp.buf[len(bp.buf)-1] + // copy data to the current empty allocated area + n := copy(b[len(b):cap(b)], p) + // increment buffered data length + bp.bufLen += n + // include written data in last buffer + bp.buf[len(bp.buf)-1] = b[:len(b)+n] + + // if there was enough room to write all then break + if len(p) == n { + break + } + + // more data: write to the next slice + p = p[n:] + // allocate slice that has twice the size of the last unless maximum reached + nextCap := 2 * cap(bp.buf[len(bp.buf)-1]) + if maxCap < nextCap { + nextCap = maxCap + } + // add new byte slice to the buffers slice and continue writing + bp.buf = append(bp.buf, make([]byte, 0, nextCap)) + } + return +} + +func (bp *BytesPipe) len() int { + return bp.bufLen - bp.lastRead +} + +// Read reads bytes from BytesPipe. +// Data could be read only once. +func (bp *BytesPipe) Read(p []byte) (n int, err error) { + for { + read := copy(p, bp.buf[0][bp.lastRead:]) + n += read + bp.lastRead += read + if bp.len() == 0 { + // we have read everything. reset to the beginning. + bp.lastRead = 0 + bp.bufLen -= len(bp.buf[0]) + bp.buf[0] = bp.buf[0][:0] + break + } + // break if everything was read + if len(p) == read { + break + } + // more buffered data and more asked. read from next slice. + p = p[read:] + bp.lastRead = 0 + bp.bufLen -= len(bp.buf[0]) + bp.buf[0] = nil // throw away old slice + bp.buf = bp.buf[1:] // switch to next + } + return +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go new file mode 100644 index 0000000000..62b1a186fe --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go @@ -0,0 +1,141 @@ +package ioutils + +import ( + "crypto/sha1" + "encoding/hex" + "testing" +) + +func TestBytesPipeRead(t *testing.T) { + buf := NewBytesPipe(nil) + buf.Write([]byte("12")) + buf.Write([]byte("34")) + buf.Write([]byte("56")) + buf.Write([]byte("78")) + buf.Write([]byte("90")) + rd := make([]byte, 4) + n, err := buf.Read(rd) + if err != nil { + t.Fatal(err) + } + if n != 4 { + t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4) + } + if string(rd) != "1234" { + t.Fatalf("Read %s, but must be %s", rd, "1234") + } + n, err = buf.Read(rd) + if err != nil { + t.Fatal(err) + } + if n != 4 { + t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4) + } + if string(rd) != "5678" { + t.Fatalf("Read %s, but must be %s", rd, "5679") + } + n, err = buf.Read(rd) + if err != nil { + t.Fatal(err) + } + if n != 2 { + t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 2) + } + if string(rd[:n]) != "90" { + t.Fatalf("Read %s, but must be %s", rd, "90") + } +} + +func TestBytesPipeWrite(t *testing.T) { + buf := NewBytesPipe(nil) + buf.Write([]byte("12")) + buf.Write([]byte("34")) + buf.Write([]byte("56")) + buf.Write([]byte("78")) + buf.Write([]byte("90")) + if string(buf.buf[0]) != "1234567890" { + t.Fatalf("Buffer %s, must be %s", buf.buf, "1234567890") + } +} + +// Write and read in different speeds/chunk sizes and check valid data is read. +func TestBytesPipeWriteRandomChunks(t *testing.T) { + cases := []struct{ iterations, writesPerLoop, readsPerLoop int }{ + {100, 10, 1}, + {1000, 10, 5}, + {1000, 100, 0}, + {1000, 5, 6}, + {10000, 50, 25}, + } + + testMessage := []byte("this is a random string for testing") + // random slice sizes to read and write + writeChunks := []int{25, 35, 15, 20} + readChunks := []int{5, 45, 20, 25} + + for _, c := range cases { + // first pass: write directly to hash + hash := sha1.New() + for i := 0; i < c.iterations*c.writesPerLoop; i++ { + if _, err := hash.Write(testMessage[:writeChunks[i%len(writeChunks)]]); err != nil { + t.Fatal(err) + } + } + expected := hex.EncodeToString(hash.Sum(nil)) + + // write/read through buffer + buf := NewBytesPipe(nil) + hash.Reset() + for i := 0; i < c.iterations; i++ { + for w := 0; w < c.writesPerLoop; w++ { + buf.Write(testMessage[:writeChunks[(i*c.writesPerLoop+w)%len(writeChunks)]]) + } + for r := 0; r < c.readsPerLoop; r++ { + p := make([]byte, readChunks[(i*c.readsPerLoop+r)%len(readChunks)]) + n, _ := buf.Read(p) + hash.Write(p[:n]) + } + } + // read rest of the data from buffer + for i := 0; ; i++ { + p := make([]byte, readChunks[(c.iterations*c.readsPerLoop+i)%len(readChunks)]) + n, _ := buf.Read(p) + if n == 0 { + break + } + hash.Write(p[:n]) + } + actual := hex.EncodeToString(hash.Sum(nil)) + + if expected != actual { + t.Fatalf("BytesPipe returned invalid data. Expected checksum %v, got %v", expected, actual) + } + + } +} + +func BenchmarkBytesPipeWrite(b *testing.B) { + for i := 0; i < b.N; i++ { + buf := NewBytesPipe(nil) + for j := 0; j < 1000; j++ { + buf.Write([]byte("pretty short line, because why not?")) + } + } +} + +func BenchmarkBytesPipeRead(b *testing.B) { + rd := make([]byte, 1024) + for i := 0; i < b.N; i++ { + b.StopTimer() + buf := NewBytesPipe(nil) + for j := 0; j < 1000; j++ { + buf.Write(make([]byte, 1024)) + } + b.StartTimer() + for j := 0; j < 1000; j++ { + if n, _ := buf.Read(rd); n != 1024 { + b.Fatalf("Wrong number of bytes: %d", n) + } + } + } +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fmt.go b/vendor/github.com/docker/docker/pkg/ioutils/fmt.go index 801132ff3d..0b04b0ba3e 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/fmt.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/fmt.go @@ -12,3 +12,11 @@ func FprintfIfNotEmpty(w io.Writer, format, value string) (int, error) { } return 0, nil } + +// FprintfIfTrue prints the boolean value if it's true +func FprintfIfTrue(w io.Writer, format string, ok bool) (int, error) { + if ok { + return fmt.Fprintf(w, format, ok) + } + return 0, nil +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers.go b/vendor/github.com/docker/docker/pkg/ioutils/readers.go index 140f6c1bfe..54dd312bb7 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/readers.go @@ -1,19 +1,12 @@ package ioutils import ( - "bytes" "crypto/sha256" "encoding/hex" "io" - "math/rand" "sync" - "time" - - "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/random" ) -var rndSrc = random.NewSource() - type readCloserWrapper struct { io.Reader closer func() error @@ -58,31 +51,19 @@ func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { // expanding buffer. type bufReader struct { sync.Mutex - buf *bytes.Buffer - reader io.Reader - err error - wait sync.Cond - drainBuf []byte - reuseBuf []byte - maxReuse int64 - resetTimeout time.Duration - bufLenResetThreshold int64 - maxReadDataReset int64 + buf io.ReadWriter + reader io.Reader + err error + wait sync.Cond + drainBuf []byte } // NewBufReader returns a new bufReader. func NewBufReader(r io.Reader) io.ReadCloser { - timeout := rand.New(rndSrc).Intn(120) + 180 - reader := &bufReader{ - buf: &bytes.Buffer{}, - drainBuf: make([]byte, 1024), - reuseBuf: make([]byte, 4096), - maxReuse: 1000, - resetTimeout: time.Duration(timeout) * time.Second, - bufLenResetThreshold: 100 * 1024, - maxReadDataReset: 10 * 1024 * 1024, - reader: r, + buf: NewBytesPipe(nil), + reader: r, + drainBuf: make([]byte, 1024), } reader.wait.L = &reader.Mutex go reader.drain() @@ -90,7 +71,7 @@ func NewBufReader(r io.Reader) io.ReadCloser { } // NewBufReaderWithDrainbufAndBuffer returns a BufReader with drainBuffer and buffer. -func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer *bytes.Buffer) io.ReadCloser { +func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer io.ReadWriter) io.ReadCloser { reader := &bufReader{ buf: buffer, drainBuf: drainBuffer, @@ -102,97 +83,24 @@ func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer * } func (r *bufReader) drain() { - var ( - duration time.Duration - lastReset time.Time - now time.Time - reset bool - bufLen int64 - dataSinceReset int64 - maxBufLen int64 - reuseBufLen int64 - reuseCount int64 - ) - reuseBufLen = int64(len(r.reuseBuf)) - lastReset = time.Now() for { + //Call to scheduler is made to yield from this goroutine. + //This avoids goroutine looping here when n=0,err=nil, fixes code hangs when run with GCC Go. + callSchedulerIfNecessary() n, err := r.reader.Read(r.drainBuf) - dataSinceReset += int64(n) r.Lock() - bufLen = int64(r.buf.Len()) - if bufLen > maxBufLen { - maxBufLen = bufLen - } - - // Avoid unbounded growth of the buffer over time. - // This has been discovered to be the only non-intrusive - // solution to the unbounded growth of the buffer. - // Alternative solutions such as compression, multiple - // buffers, channels and other similar pieces of code - // were reducing throughput, overall Docker performance - // or simply crashed Docker. - // This solution releases the buffer when specific - // conditions are met to avoid the continuous resizing - // of the buffer for long lived containers. - // - // Move data to the front of the buffer if it's - // smaller than what reuseBuf can store - if bufLen > 0 && reuseBufLen >= bufLen { - n, _ := r.buf.Read(r.reuseBuf) - r.buf.Write(r.reuseBuf[0:n]) - // Take action if the buffer has been reused too many - // times and if there's data in the buffer. - // The timeout is also used as means to avoid doing - // these operations more often or less often than - // required. - // The various conditions try to detect heavy activity - // in the buffer which might be indicators of heavy - // growth of the buffer. - } else if reuseCount >= r.maxReuse && bufLen > 0 { - now = time.Now() - duration = now.Sub(lastReset) - timeoutReached := duration >= r.resetTimeout - - // The timeout has been reached and the - // buffered data couldn't be moved to the front - // of the buffer, so the buffer gets reset. - if timeoutReached && bufLen > reuseBufLen { - reset = true - } - // The amount of buffered data is too high now, - // reset the buffer. - if timeoutReached && maxBufLen >= r.bufLenResetThreshold { - reset = true - } - // Reset the buffer if a certain amount of - // data has gone through the buffer since the - // last reset. - if timeoutReached && dataSinceReset >= r.maxReadDataReset { - reset = true - } - // The buffered data is moved to a fresh buffer, - // swap the old buffer with the new one and - // reset all counters. - if reset { - newbuf := &bytes.Buffer{} - newbuf.ReadFrom(r.buf) - r.buf = newbuf - lastReset = now - reset = false - dataSinceReset = 0 - maxBufLen = 0 - reuseCount = 0 - } - } if err != nil { r.err = err } else { - r.buf.Write(r.drainBuf[0:n]) + if n == 0 { + // nothing written, no need to signal + r.Unlock() + continue + } + r.buf.Write(r.drainBuf[:n]) } - reuseCount++ r.wait.Signal() r.Unlock() - callSchedulerIfNecessary() if err != nil { break } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go b/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go index 0a39b6ec6a..5c26a2a147 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go @@ -7,6 +7,7 @@ import ( "io/ioutil" "strings" "testing" + "time" ) // Implement io.Reader @@ -61,8 +62,8 @@ func TestNewBufReaderWithDrainbufAndBuffer(t *testing.T) { reader, writer := io.Pipe() drainBuffer := make([]byte, 1024) - buffer := bytes.Buffer{} - bufreader := NewBufReaderWithDrainbufAndBuffer(reader, drainBuffer, &buffer) + buffer := NewBytesPipe(nil) + bufreader := NewBufReaderWithDrainbufAndBuffer(reader, drainBuffer, buffer) // Write everything down to a Pipe // Usually, a pipe should block but because of the buffered reader, @@ -76,7 +77,11 @@ func TestNewBufReaderWithDrainbufAndBuffer(t *testing.T) { // Drain the reader *after* everything has been written, just to verify // it is indeed buffering - <-done + select { + case <-done: + case <-time.After(1 * time.Second): + t.Fatal("timeout") + } output, err := ioutil.ReadAll(bufreader) if err != nil { @@ -124,13 +129,16 @@ func TestBufReaderCloseWithNonReaderCloser(t *testing.T) { } // implements io.ReadCloser -type simpleReaderCloser struct{} +type simpleReaderCloser struct { + err error +} func (r *simpleReaderCloser) Read(p []byte) (n int, err error) { - return 0, nil + return 0, r.err } func (r *simpleReaderCloser) Close() error { + r.err = io.EOF return nil } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go new file mode 100644 index 0000000000..1539ad21b5 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go @@ -0,0 +1,10 @@ +// +build !windows + +package ioutils + +import "io/ioutil" + +// TempDir on Unix systems is equivalent to ioutil.TempDir. +func TempDir(dir, prefix string) (string, error) { + return ioutil.TempDir(dir, prefix) +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go new file mode 100644 index 0000000000..fc755c6d16 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go @@ -0,0 +1,18 @@ +// +build windows + +package ioutils + +import ( + "io/ioutil" + + "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/longpath" +) + +// TempDir is the equivalent of ioutil.TempDir, except that the result is in Windows longpath format. +func TempDir(dir, prefix string) (string, error) { + tempDir, err := ioutil.TempDir(dir, prefix) + if err != nil { + return "", err + } + return longpath.AddPrefix(tempDir), nil +} diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath.go b/vendor/github.com/docker/docker/pkg/longpath/longpath.go new file mode 100644 index 0000000000..9b15bfff4c --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/longpath/longpath.go @@ -0,0 +1,26 @@ +// longpath introduces some constants and helper functions for handling long paths +// in Windows, which are expected to be prepended with `\\?\` and followed by either +// a drive letter, a UNC server\share, or a volume identifier. + +package longpath + +import ( + "strings" +) + +// Prefix is the longpath prefix for Windows file paths. +const Prefix = `\\?\` + +// AddPrefix will add the Windows long path prefix to the path provided if +// it does not already have it. +func AddPrefix(path string) string { + if !strings.HasPrefix(path, Prefix) { + if strings.HasPrefix(path, `\\`) { + // This is a UNC path, so we need to add 'UNC' to the path as well. + path = Prefix + `UNC` + path[1:] + } else { + path = Prefix + path + } + } + return path +} diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go b/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go new file mode 100644 index 0000000000..01865eff09 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go @@ -0,0 +1,22 @@ +package longpath + +import ( + "strings" + "testing" +) + +func TestStandardLongPath(t *testing.T) { + c := `C:\simple\path` + longC := AddPrefix(c) + if !strings.EqualFold(longC, `\\?\C:\simple\path`) { + t.Errorf("Wrong long path returned. Original = %s ; Long = %s", c, longC) + } +} + +func TestUNCLongPath(t *testing.T) { + c := `\\server\share\path` + longC := AddPrefix(c) + if !strings.EqualFold(longC, `\\?\UNC\server\share\path`) { + t.Errorf("Wrong UNC long path returned. Original = %s ; Long = %s", c, longC) + } +} diff --git a/vendor/github.com/docker/docker/pkg/mflag/flag.go b/vendor/github.com/docker/docker/pkg/mflag/flag.go index 2c9d143260..dd1623e7f1 100644 --- a/vendor/github.com/docker/docker/pkg/mflag/flag.go +++ b/vendor/github.com/docker/docker/pkg/mflag/flag.go @@ -200,6 +200,24 @@ func (i *uint64Value) Get() interface{} { return uint64(*i) } func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) } +// -- uint16 Value +type uint16Value uint16 + +func newUint16Value(val uint16, p *uint16) *uint16Value { + *p = val + return (*uint16Value)(p) +} + +func (i *uint16Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 16) + *i = uint16Value(v) + return err +} + +func (i *uint16Value) Get() interface{} { return uint16(*i) } + +func (i *uint16Value) String() string { return fmt.Sprintf("%v", *i) } + // -- string Value type stringValue string @@ -757,6 +775,32 @@ func Uint64(names []string, value uint64, usage string) *uint64 { return CommandLine.Uint64(names, value, usage) } +// Uint16Var defines a uint16 flag with specified name, default value, and usage string. +// The argument p points to a uint16 variable in which to store the value of the flag. +func (fs *FlagSet) Uint16Var(p *uint16, names []string, value uint16, usage string) { + fs.Var(newUint16Value(value, p), names, usage) +} + +// Uint16Var defines a uint16 flag with specified name, default value, and usage string. +// The argument p points to a uint16 variable in which to store the value of the flag. +func Uint16Var(p *uint16, names []string, value uint16, usage string) { + CommandLine.Var(newUint16Value(value, p), names, usage) +} + +// Uint16 defines a uint16 flag with specified name, default value, and usage string. +// The return value is the address of a uint16 variable that stores the value of the flag. +func (fs *FlagSet) Uint16(names []string, value uint16, usage string) *uint16 { + p := new(uint16) + fs.Uint16Var(p, names, value, usage) + return p +} + +// Uint16 defines a uint16 flag with specified name, default value, and usage string. +// The return value is the address of a uint16 variable that stores the value of the flag. +func Uint16(names []string, value uint16, usage string) *uint16 { + return CommandLine.Uint16(names, value, usage) +} + // StringVar defines a string flag with specified name, default value, and usage string. // The argument p points to a string variable in which to store the value of the flag. func (fs *FlagSet) StringVar(p *string, names []string, value string, usage string) { diff --git a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go b/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go index f265dfd46b..159daba1ca 100644 --- a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go +++ b/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go @@ -11,9 +11,12 @@ var ( "admiring", "adoring", "agitated", + "amazing", "angry", + "awesome", "backstabbing", "berserk", + "big", "boring", "clever", "cocky", @@ -32,6 +35,7 @@ var ( "fervent", "focused", "furious", + "gigantic", "gloomy", "goofy", "grave", @@ -59,19 +63,25 @@ var ( "sick", "silly", "sleepy", + "small", "stoic", "stupefied", "suspicious", "tender", "thirsty", + "tiny", "trusting", } // Docker, starting from 0.7.x, generates names from notable scientists and hackers. + // Please, for any amazing man that you add to the list, consider adding an equally amazing woman to it, and vice versa. right = [...]string{ // Muhammad ibn Jābir al-Ḥarrānī al-Battānī was a founding father of astronomy. https://en.wikipedia.org/wiki/Mu%E1%B8%A5ammad_ibn_J%C4%81bir_al-%E1%B8%A4arr%C4%81n%C4%AB_al-Batt%C4%81n%C4%AB "albattani", + // Frances E. Allen, became the first female IBM Fellow in 1989. In 2006, she became the first female recipient of the ACM's Turing Award. https://en.wikipedia.org/wiki/Frances_E._Allen + "allen", + // June Almeida - Scottish virologist who took the first pictures of the rubella virus - https://en.wikipedia.org/wiki/June_Almeida "almeida", @@ -84,19 +94,17 @@ var ( // Aryabhata - Ancient Indian mathematician-astronomer during 476-550 CE https://en.wikipedia.org/wiki/Aryabhata "aryabhata", + // Wanda Austin - Wanda Austin is the President and CEO of The Aerospace Corporation, a leading architect for the US security space programs. https://en.wikipedia.org/wiki/Wanda_Austin + "austin", + // Charles Babbage invented the concept of a programmable computer. https://en.wikipedia.org/wiki/Charles_Babbage. "babbage", // Stefan Banach - Polish mathematician, was one of the founders of modern functional analysis. https://en.wikipedia.org/wiki/Stefan_Banach "banach", - // William Shockley, Walter Houser Brattain and John Bardeen co-invented the transistor (thanks Brian Goff). - // - https://en.wikipedia.org/wiki/John_Bardeen - // - https://en.wikipedia.org/wiki/Walter_Houser_Brattain - // - https://en.wikipedia.org/wiki/William_Shockley + // John Bardeen co-invented the transistor - https://en.wikipedia.org/wiki/John_Bardeen "bardeen", - "brattain", - "shockley", // Jean Bartik, born Betty Jean Jennings, was one of the original programmers for the ENIAC computer. https://en.wikipedia.org/wiki/Jean_Bartik "bartik", @@ -116,19 +124,31 @@ var ( // Niels Bohr is the father of quantum theory. https://en.wikipedia.org/wiki/Niels_Bohr. "bohr", + // Kathleen Booth, she's credited with writing the first assembly language. https://en.wikipedia.org/wiki/Kathleen_Booth + "booth", + + // Anita Borg - Anita Borg was the founding director of the Institute for Women and Technology (IWT). https://en.wikipedia.org/wiki/Anita_Borg + "borg", + // Satyendra Nath Bose - He provided the foundation for Bose–Einstein statistics and the theory of the Bose–Einstein condensate. - https://en.wikipedia.org/wiki/Satyendra_Nath_Bose "bose", + // Evelyn Boyd Granville - She was one of the first African-American woman to receive a Ph.D. in mathematics; she earned it in 1949 from Yale University. https://en.wikipedia.org/wiki/Evelyn_Boyd_Granville + "boyd", + // Brahmagupta - Ancient Indian mathematician during 598-670 CE who gave rules to compute with zero - https://en.wikipedia.org/wiki/Brahmagupta#Zero "brahmagupta", + // Walter Houser Brattain co-invented the transistor - https://en.wikipedia.org/wiki/Walter_Houser_Brattain + "brattain", + // Emmett Brown invented time travel. https://en.wikipedia.org/wiki/Emmett_Brown (thanks Brian Goff) "brown", // Rachel Carson - American marine biologist and conservationist, her book Silent Spring and other writings are credited with advancing the global environmental movement. https://en.wikipedia.org/wiki/Rachel_Carson "carson", - //Subrahmanyan Chandrasekhar - Astrophysicist known for his mathematical theory on different stages and evolution in structures of the stars. He has won nobel prize for physics - https://en.wikipedia.org/wiki/Subrahmanyan_Chandrasekhar + // Subrahmanyan Chandrasekhar - Astrophysicist known for his mathematical theory on different stages and evolution in structures of the stars. He has won nobel prize for physics - https://en.wikipedia.org/wiki/Subrahmanyan_Chandrasekhar "chandrasekhar", // Jane Colden - American botanist widely considered the first female American botanist - https://en.wikipedia.org/wiki/Jane_Colden @@ -149,6 +169,15 @@ var ( // Leonardo Da Vinci invented too many things to list here. https://en.wikipedia.org/wiki/Leonardo_da_Vinci. "davinci", + // Edsger Wybe Dijkstra was a Dutch computer scientist and mathematical scientist. https://en.wikipedia.org/wiki/Edsger_W._Dijkstra. + "dijkstra", + + // Donna Dubinsky - played an integral role in the development of personal digital assistants (PDAs) serving as CEO of Palm, Inc. and co-founding Handspring. https://en.wikipedia.org/wiki/Donna_Dubinsky + "dubinsky", + + // Annie Easley - She was a leading member of the team which developed software for the Centaur rocket stage and one of the first African-Americans in her field. https://en.wikipedia.org/wiki/Annie_Easley + "easley", + // Albert Einstein invented the general theory of relativity. https://en.wikipedia.org/wiki/Albert_Einstein "einstein", @@ -176,12 +205,21 @@ var ( // Galileo was a founding father of modern astronomy, and faced politics and obscurantism to establish scientific truth. https://en.wikipedia.org/wiki/Galileo_Galilei "galileo", + // William Henry "Bill" Gates III is an American business magnate, philanthropist, investor, computer programmer, and inventor. https://en.wikipedia.org/wiki/Bill_Gates + "gates", + + // Adele Goldberg, was one of the designers and developers of the Smalltalk language. https://en.wikipedia.org/wiki/Adele_Goldberg_(computer_scientist) + "goldberg", + // Adele Goldstine, born Adele Katz, wrote the complete technical description for the first electronic digital computer, ENIAC. https://en.wikipedia.org/wiki/Adele_Goldstine "goldstine", // Jane Goodall - British primatologist, ethologist, and anthropologist who is considered to be the world's foremost expert on chimpanzees - https://en.wikipedia.org/wiki/Jane_Goodall "goodall", + // Margaret Hamilton - Director of the Software Engineering Division of the MIT Instrumentation Laboratory, which developed on-board flight software for the Apollo space program. https://en.wikipedia.org/wiki/Margaret_Hamilton_(scientist) + "hamilton", + // Stephen Hawking pioneered the field of cosmology by combining general relativity and quantum mechanics. https://en.wikipedia.org/wiki/Stephen_Hawking "hawking", @@ -197,39 +235,69 @@ var ( // Grace Hopper developed the first compiler for a computer programming language and is credited with popularizing the term "debugging" for fixing computer glitches. https://en.wikipedia.org/wiki/Grace_Hopper "hopper", + // Frances Hugle, she was an American scientist, engineer, and inventor who contributed to the understanding of semiconductors, integrated circuitry, and the unique electrical principles of microscopic materials. https://en.wikipedia.org/wiki/Frances_Hugle + "hugle", + // Hypatia - Greek Alexandrine Neoplatonist philosopher in Egypt who was one of the earliest mothers of mathematics - https://en.wikipedia.org/wiki/Hypatia "hypatia", // Yeong-Sil Jang was a Korean scientist and astronomer during the Joseon Dynasty; he invented the first metal printing press and water gauge. https://en.wikipedia.org/wiki/Jang_Yeong-sil "jang", + // Betty Jennings - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Jean_Bartik + "jennings", + + // Mary Lou Jepsen, was the founder and chief technology officer of One Laptop Per Child (OLPC), and the founder of Pixel Qi. https://en.wikipedia.org/wiki/Mary_Lou_Jepsen + "jepsen", + + // Irène Joliot-Curie - French scientist who was awarded the Nobel Prize for Chemistry in 1935. Daughter of Marie and Pierre Curie. https://en.wikipedia.org/wiki/Ir%C3%A8ne_Joliot-Curie + "joliot", + // Karen Spärck Jones came up with the concept of inverse document frequency, which is used in most search engines today. https://en.wikipedia.org/wiki/Karen_Sp%C3%A4rck_Jones "jones", - // Jack Kilby and Robert Noyce have invented silicone integrated circuits and gave Silicon Valley its name. - // - https://en.wikipedia.org/wiki/Jack_Kilby - // - https://en.wikipedia.org/wiki/Robert_Noyce - "kilby", - "noyce", - // A. P. J. Abdul Kalam - is an Indian scientist aka Missile Man of India for his work on the development of ballistic missile and launch vehicle technology - https://en.wikipedia.org/wiki/A._P._J._Abdul_Kalam "kalam", + // Susan Kare, created the icons and many of the interface elements for the original Apple Macintosh in the 1980s, and was an original employee of NeXT, working as the Creative Director. https://en.wikipedia.org/wiki/Susan_Kare + "kare", + + // Mary Kenneth Keller, Sister Mary Kenneth Keller became the first American woman to earn a PhD in Computer Science in 1965. https://en.wikipedia.org/wiki/Mary_Kenneth_Keller + "keller", + // Har Gobind Khorana - Indian-American biochemist who shared the 1968 Nobel Prize for Physiology - https://en.wikipedia.org/wiki/Har_Gobind_Khorana "khorana", + // Jack Kilby invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Jack_Kilby + "kilby", + // Maria Kirch - German astronomer and first woman to discover a comet - https://en.wikipedia.org/wiki/Maria_Margarethe_Kirch "kirch", + // Donald Knuth - American computer scientist, author of "The Art of Computer Programming" and creator of the TeX typesetting system. https://en.wikipedia.org/wiki/Donald_Knuth + "knuth", + // Sophie Kowalevski - Russian mathematician responsible for important original contributions to analysis, differential equations and mechanics - https://en.wikipedia.org/wiki/Sofia_Kovalevskaya "kowalevski", // Marie-Jeanne de Lalande - French astronomer, mathematician and cataloguer of stars - https://en.wikipedia.org/wiki/Marie-Jeanne_de_Lalande "lalande", + // Hedy Lamarr - Actress and inventor. The principles of her work are now incorporated into modern Wi-Fi, CDMA and Bluetooth technology. https://en.wikipedia.org/wiki/Hedy_Lamarr + "lamarr", + // Mary Leakey - British paleoanthropologist who discovered the first fossilized Proconsul skull - https://en.wikipedia.org/wiki/Mary_Leakey "leakey", + // Henrietta Swan Leavitt - she was an American astronomer who discovered the relation between the luminosity and the period of Cepheid variable stars. https://en.wikipedia.org/wiki/Henrietta_Swan_Leavitt + "leavitt", + + // Ruth Lichterman - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Ruth_Teitelbaum + "lichterman", + + // Barbara Liskov - co-developed the Liskov substitution principle. Liskov was also the winner of the Turing Prize in 2008. - https://en.wikipedia.org/wiki/Barbara_Liskov + "liskov", + // Ada Lovelace invented the first algorithm. https://en.wikipedia.org/wiki/Ada_Lovelace (thanks James Turnbull) "lovelace", @@ -251,12 +319,24 @@ var ( // Malcolm McLean invented the modern shipping container: https://en.wikipedia.org/wiki/Malcom_McLean "mclean", + // Kay McNulty - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Kathleen_Antonelli + "mcnulty", + // Lise Meitner - Austrian/Swedish physicist who was involved in the discovery of nuclear fission. The element meitnerium is named after her - https://en.wikipedia.org/wiki/Lise_Meitner "meitner", + // Carla Meninsky, was the game designer and programmer for Atari 2600 games Dodge 'Em and Warlords. https://en.wikipedia.org/wiki/Carla_Meninsky + "meninsky", + // Johanna Mestorf - German prehistoric archaeologist and first female museum director in Germany - https://en.wikipedia.org/wiki/Johanna_Mestorf "mestorf", + // Lise Meitner was an Austrian physicist who worked on radioactivity and nuclear physics. She played a major role in the discovery of nuclear fission. https://en.wikipedia.org/wiki/Lise_Meitner + "mietner", + + // Maryam Mirzakhani - an Iranian mathematician and the first woman to win the Fields Medal. https://en.wikipedia.org/wiki/Maryam_Mirzakhani + "mirzakhani", + // Samuel Morse - contributed to the invention of a single-wire telegraph system based on European telegraphs and was a co-developer of the Morse code - https://en.wikipedia.org/wiki/Samuel_Morse "morse", @@ -266,18 +346,24 @@ var ( // Alfred Nobel - a Swedish chemist, engineer, innovator, and armaments manufacturer (inventor of dynamite) - https://en.wikipedia.org/wiki/Alfred_Nobel "nobel", + // Poppy Northcutt. Poppy Northcutt was the first woman to work as part of NASA’s Mission Control. http://www.businessinsider.com/poppy-northcutt-helped-apollo-astronauts-2014-12?op=1 + "northcutt", + + // Robert Noyce invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Robert_Noyce + "noyce", + // Panini - Ancient Indian linguist and grammarian from 4th century CE who worked on the world's first formal system - https://en.wikipedia.org/wiki/P%C4%81%E1%B9%87ini#Comparison_with_modern_formal_systems "panini", - // Cecilia Payne-Gaposchkin was an astronomer and astrophysicist who, in 1925, proposed in her Ph.D. thesis an explanation for the composition of stars in terms of the relative abundances of hydrogen and helium. https://en.wikipedia.org/wiki/Cecilia_Payne-Gaposchkin - "payne", - // Ambroise Pare invented modern surgery. https://en.wikipedia.org/wiki/Ambroise_Par%C3%A9 "pare", // Louis Pasteur discovered vaccination, fermentation and pasteurization. https://en.wikipedia.org/wiki/Louis_Pasteur. "pasteur", + // Cecilia Payne-Gaposchkin was an astronomer and astrophysicist who, in 1925, proposed in her Ph.D. thesis an explanation for the composition of stars in terms of the relative abundances of hydrogen and helium. https://en.wikipedia.org/wiki/Cecilia_Payne-Gaposchkin + "payne", + // Radia Perlman is a software designer and network engineer and most famous for her invention of the spanning-tree protocol (STP). https://en.wikipedia.org/wiki/Radia_Perlman "perlman", @@ -299,11 +385,14 @@ var ( // Srinivasa Ramanujan - Indian mathematician and autodidact who made extraordinary contributions to mathematical analysis, number theory, infinite series, and continued fractions. - https://en.wikipedia.org/wiki/Srinivasa_Ramanujan "ramanujan", - // Dennis Ritchie and Ken Thompson created UNIX and the C programming language. - // - https://en.wikipedia.org/wiki/Dennis_Ritchie - // - https://en.wikipedia.org/wiki/Ken_Thompson + // Sally Kristen Ride was an American physicist and astronaut. She was the first American woman in space, and the youngest American astronaut. https://en.wikipedia.org/wiki/Sally_Ride + "ride", + + // Dennis Ritchie - co-creator of UNIX and the C programming language. - https://en.wikipedia.org/wiki/Dennis_Ritchie "ritchie", - "thompson", + + // Wilhelm Conrad Röntgen - German physicist who was awarded the first Nobel Prize in Physics in 1901 for the discovery of X-rays (Röntgen rays). https://en.wikipedia.org/wiki/Wilhelm_R%C3%B6ntgen + "roentgen", // Rosalind Franklin - British biophysicist and X-ray crystallographer whose research was critical to the understanding of DNA - https://en.wikipedia.org/wiki/Rosalind_Franklin "rosalind", @@ -314,18 +403,39 @@ var ( // Jean E. Sammet developed FORMAC, the first widely used computer language for symbolic manipulation of mathematical formulas. https://en.wikipedia.org/wiki/Jean_E._Sammet "sammet", + // Carol Shaw - Originally an Atari employee, Carol Shaw is said to be the first female video game designer. https://en.wikipedia.org/wiki/Carol_Shaw_(video_game_designer) + "shaw", + + // William Shockley co-invented the transistor - https://en.wikipedia.org/wiki/William_Shockley + "shockley", + // Françoise Barré-Sinoussi - French virologist and Nobel Prize Laureate in Physiology or Medicine; her work was fundamental in identifying HIV as the cause of AIDS. https://en.wikipedia.org/wiki/Fran%C3%A7oise_Barr%C3%A9-Sinoussi "sinoussi", + // Betty Snyder - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Betty_Holberton + "snyder", + + // Frances Spence - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Frances_Spence + "spence", + // Richard Matthew Stallman - the founder of the Free Software movement, the GNU project, the Free Software Foundation, and the League for Programming Freedom. He also invented the concept of copyleft to protect the ideals of this movement, and enshrined this concept in the widely-used GPL (General Public License) for software. https://en.wikiquote.org/wiki/Richard_Stallman "stallman", + // Janese Swanson (with others) developed the first of the Carmen Sandiego games. She went on to found Girl Tech. https://en.wikipedia.org/wiki/Janese_Swanson + "swanson", + // Aaron Swartz was influential in creating RSS, Markdown, Creative Commons, Reddit, and much of the internet as we know it today. He was devoted to freedom of information on the web. https://en.wikiquote.org/wiki/Aaron_Swartz "swartz", + // Bertha Swirles was a theoretical physicist who made a number of contributions to early quantum theory. https://en.wikipedia.org/wiki/Bertha_Swirles + "swirles", + // Nikola Tesla invented the AC electric system and every gadget ever used by a James Bond villain. https://en.wikipedia.org/wiki/Nikola_Tesla "tesla", + // Ken Thompson - co-creator of UNIX and the C programming language - https://en.wikipedia.org/wiki/Ken_Thompson + "thompson", + // Linus Torvalds invented Linux and Git. https://en.wikipedia.org/wiki/Linus_Torvalds "torvalds", @@ -338,9 +448,18 @@ var ( // Sir Mokshagundam Visvesvaraya - is a notable Indian engineer. He is a recipient of the Indian Republic's highest honour, the Bharat Ratna, in 1955. On his birthday, 15 September is celebrated as Engineer's Day in India in his memory - https://en.wikipedia.org/wiki/Visvesvaraya "visvesvaraya", + // Marlyn Wescoff - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Marlyn_Meltzer + "wescoff", + + // Roberta Williams, did pioneering work in graphical adventure games for personal computers, particularly the King's Quest series. https://en.wikipedia.org/wiki/Roberta_Williams + "williams", + // Sophie Wilson designed the first Acorn Micro-Computer and the instruction set for ARM processors. https://en.wikipedia.org/wiki/Sophie_Wilson "wilson", + // Jeannette Wing - co-developed the Liskov substitution principle. - https://en.wikipedia.org/wiki/Jeannette_Wing + "wing", + // Steve Wozniak invented the Apple I and Apple II. https://en.wikipedia.org/wiki/Steve_Wozniak "wozniak", diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes.go b/vendor/github.com/docker/docker/pkg/system/chtimes.go new file mode 100644 index 0000000000..31ed9ff100 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/chtimes.go @@ -0,0 +1,31 @@ +package system + +import ( + "os" + "time" +) + +// Chtimes changes the access time and modified time of a file at the given path +func Chtimes(name string, atime time.Time, mtime time.Time) error { + unixMinTime := time.Unix(0, 0) + // The max Unix time is 33 bits set + unixMaxTime := unixMinTime.Add((1<<33 - 1) * time.Second) + + // If the modified time is prior to the Unix Epoch, or after the + // end of Unix Time, os.Chtimes has undefined behavior + // default to Unix Epoch in this case, just in case + + if atime.Before(unixMinTime) || atime.After(unixMaxTime) { + atime = unixMinTime + } + + if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) { + mtime = unixMinTime + } + + if err := os.Chtimes(name, atime, mtime); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_test.go new file mode 100644 index 0000000000..f65a4b8073 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_test.go @@ -0,0 +1,120 @@ +package system + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" +) + +// prepareTempFile creates a temporary file in a temporary directory. +func prepareTempFile(t *testing.T) (string, string) { + dir, err := ioutil.TempDir("", "docker-system-test") + if err != nil { + t.Fatal(err) + } + + file := filepath.Join(dir, "exist") + if err := ioutil.WriteFile(file, []byte("hello"), 0644); err != nil { + t.Fatal(err) + } + return file, dir +} + +// TestChtimes tests Chtimes on a tempfile. Test only mTime, because aTime is OS dependent +func TestChtimes(t *testing.T) { + file, dir := prepareTempFile(t) + defer os.RemoveAll(dir) + + beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) + unixEpochTime := time.Unix(0, 0) + afterUnixEpochTime := time.Unix(100, 0) + // The max Unix time is 33 bits set + unixMaxTime := unixEpochTime.Add((1<<33 - 1) * time.Second) + afterUnixMaxTime := unixMaxTime.Add(100 * time.Second) + + // Test both aTime and mTime set to Unix Epoch + Chtimes(file, unixEpochTime, unixEpochTime) + + f, err := os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) + } + + // Test aTime before Unix Epoch and mTime set to Unix Epoch + Chtimes(file, beforeUnixEpochTime, unixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixEpochTime, beforeUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) + } + + // Test both aTime and mTime set to after Unix Epoch (valid time) + Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != afterUnixEpochTime { + t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, f.ModTime()) + } + + // Test both aTime and mTime set to Unix max time + Chtimes(file, unixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, f.ModTime()) + } + + // Test aTime after Unix max time and mTime set to Unix max time + Chtimes(file, afterUnixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, f.ModTime()) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixMaxTime, afterUnixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + if f.ModTime() != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) + } +} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go new file mode 100644 index 0000000000..6998bbef5d --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go @@ -0,0 +1,121 @@ +// +build linux freebsd + +package system + +import ( + "os" + "syscall" + "testing" + "time" +) + +// TestChtimes tests Chtimes access time on a tempfile on Linux +func TestChtimesLinux(t *testing.T) { + file, dir := prepareTempFile(t) + defer os.RemoveAll(dir) + + beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) + unixEpochTime := time.Unix(0, 0) + afterUnixEpochTime := time.Unix(100, 0) + // The max Unix time is 33 bits set + unixMaxTime := unixEpochTime.Add((1<<33 - 1) * time.Second) + afterUnixMaxTime := unixMaxTime.Add(100 * time.Second) + + // Test both aTime and mTime set to Unix Epoch + Chtimes(file, unixEpochTime, unixEpochTime) + + f, err := os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat := f.Sys().(*syscall.Stat_t) + aTime := time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime before Unix Epoch and mTime set to Unix Epoch + Chtimes(file, beforeUnixEpochTime, unixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixEpochTime, beforeUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test both aTime and mTime set to after Unix Epoch (valid time) + Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != afterUnixEpochTime { + t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, aTime) + } + + // Test both aTime and mTime set to Unix max time + Chtimes(file, unixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, aTime) + } + + // Test aTime after Unix max time and mTime set to Unix max time + Chtimes(file, afterUnixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixMaxTime, afterUnixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + stat = f.Sys().(*syscall.Stat_t) + aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + if aTime != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, aTime) + } +} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go new file mode 100644 index 0000000000..f09c402847 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go @@ -0,0 +1,114 @@ +// +build windows + +package system + +import ( + "os" + "syscall" + "testing" + "time" +) + +// TestChtimes tests Chtimes access time on a tempfile on Windows +func TestChtimesWindows(t *testing.T) { + file, dir := prepareTempFile(t) + defer os.RemoveAll(dir) + + beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) + unixEpochTime := time.Unix(0, 0) + afterUnixEpochTime := time.Unix(100, 0) + // The max Unix time is 33 bits set + unixMaxTime := unixEpochTime.Add((1<<33 - 1) * time.Second) + afterUnixMaxTime := unixMaxTime.Add(100 * time.Second) + + // Test both aTime and mTime set to Unix Epoch + Chtimes(file, unixEpochTime, unixEpochTime) + + f, err := os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime := time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime before Unix Epoch and mTime set to Unix Epoch + Chtimes(file, beforeUnixEpochTime, unixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixEpochTime, beforeUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test both aTime and mTime set to after Unix Epoch (valid time) + Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != afterUnixEpochTime { + t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, aTime) + } + + // Test both aTime and mTime set to Unix max time + Chtimes(file, unixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, aTime) + } + + // Test aTime after Unix max time and mTime set to Unix max time + Chtimes(file, afterUnixMaxTime, unixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixEpochTime { + t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) + } + + // Test aTime set to Unix Epoch and mTime before Unix Epoch + Chtimes(file, unixMaxTime, afterUnixMaxTime) + + f, err = os.Stat(file) + if err != nil { + t.Fatal(err) + } + + aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) + if aTime != unixMaxTime { + t.Fatalf("Expected: %s, got: %s", unixMaxTime, aTime) + } +} diff --git a/vendor/github.com/docker/docker/pkg/system/errors.go b/vendor/github.com/docker/docker/pkg/system/errors.go index 63045186fe..288318985e 100644 --- a/vendor/github.com/docker/docker/pkg/system/errors.go +++ b/vendor/github.com/docker/docker/pkg/system/errors.go @@ -5,5 +5,6 @@ import ( ) var ( + // ErrNotSupportedPlatform means the platform is not supported. ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") ) diff --git a/vendor/github.com/docker/docker/pkg/system/events_windows.go b/vendor/github.com/docker/docker/pkg/system/events_windows.go index 23f7c618bc..04e2de7871 100644 --- a/vendor/github.com/docker/docker/pkg/system/events_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/events_windows.go @@ -8,11 +8,6 @@ import ( "unsafe" ) -const ( - EVENT_ALL_ACCESS = 0x1F0003 - EVENT_MODIFY_STATUS = 0x0002 -) - var ( procCreateEvent = modkernel32.NewProc("CreateEventW") procOpenEvent = modkernel32.NewProc("OpenEventW") @@ -21,13 +16,14 @@ var ( procPulseEvent = modkernel32.NewProc("PulseEvent") ) +// CreateEvent implements win32 CreateEventW func in golang. It will create an event object. func CreateEvent(eventAttributes *syscall.SecurityAttributes, manualReset bool, initialState bool, name string) (handle syscall.Handle, err error) { namep, _ := syscall.UTF16PtrFromString(name) - var _p1 uint32 = 0 + var _p1 uint32 if manualReset { _p1 = 1 } - var _p2 uint32 = 0 + var _p2 uint32 if initialState { _p2 = 1 } @@ -40,9 +36,10 @@ func CreateEvent(eventAttributes *syscall.SecurityAttributes, manualReset bool, return } +// OpenEvent implements win32 OpenEventW func in golang. It opens an event object. func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle syscall.Handle, err error) { namep, _ := syscall.UTF16PtrFromString(name) - var _p1 uint32 = 0 + var _p1 uint32 if inheritHandle { _p1 = 1 } @@ -55,14 +52,17 @@ func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle sy return } +// SetEvent implements win32 SetEvent func in golang. func SetEvent(handle syscall.Handle) (err error) { return setResetPulse(handle, procSetEvent) } +// ResetEvent implements win32 ResetEvent func in golang. func ResetEvent(handle syscall.Handle) (err error) { return setResetPulse(handle, procResetEvent) } +// PulseEvent implements win32 PulseEvent func in golang. func PulseEvent(handle syscall.Handle) (err error) { return setResetPulse(handle, procPulseEvent) } diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go index e1f70e8dac..c14feb8496 100644 --- a/vendor/github.com/docker/docker/pkg/system/filesys.go +++ b/vendor/github.com/docker/docker/pkg/system/filesys.go @@ -4,8 +4,16 @@ package system import ( "os" + "path/filepath" ) +// MkdirAll creates a directory named path along with any necessary parents, +// with permission specified by attribute perm for all dir created. func MkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) } + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. +func IsAbs(path string) bool { + return filepath.IsAbs(path) +} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go index 90b500608e..16823d5517 100644 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go @@ -4,7 +4,9 @@ package system import ( "os" + "path/filepath" "regexp" + "strings" "syscall" ) @@ -62,3 +64,19 @@ func MkdirAll(path string, perm os.FileMode) error { } return nil } + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, +// golang filepath.IsAbs does not consider a path \windows\system32 as absolute +// as it doesn't start with a drive-letter/colon combination. However, in +// docker we need to verify things such as WORKDIR /windows/system32 in +// a Dockerfile (which gets translated to \windows\system32 when being processed +// by the daemon. This SHOULD be treated as absolute from a docker processing +// perspective. +func IsAbs(path string) bool { + if !filepath.IsAbs(path) { + if !strings.HasPrefix(path, string(os.PathSeparator)) { + return false + } + } + return true +} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat.go b/vendor/github.com/docker/docker/pkg/system/lstat.go index d0e43b3709..bd23c4d50b 100644 --- a/vendor/github.com/docker/docker/pkg/system/lstat.go +++ b/vendor/github.com/docker/docker/pkg/system/lstat.go @@ -7,10 +7,10 @@ import ( ) // Lstat takes a path to a file and returns -// a system.Stat_t type pertaining to that file. +// a system.StatT type pertaining to that file. // // Throws an error if the file does not exist -func Lstat(path string) (*Stat_t, error) { +func Lstat(path string) (*StatT, error) { s := &syscall.Stat_t{} if err := syscall.Lstat(path, s); err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_test.go b/vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go similarity index 95% rename from vendor/github.com/docker/docker/pkg/system/lstat_test.go rename to vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go index 6bac492eb1..062cf53bfe 100644 --- a/vendor/github.com/docker/docker/pkg/system/lstat_test.go +++ b/vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go @@ -1,3 +1,5 @@ +// +build linux freebsd + package system import ( diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go b/vendor/github.com/docker/docker/pkg/system/lstat_windows.go index eee1be26eb..49e87eb40b 100644 --- a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/lstat_windows.go @@ -6,21 +6,17 @@ import ( "os" ) -// Some explanation for my own sanity, and hopefully maintainers in the -// future. -// // Lstat calls os.Lstat to get a fileinfo interface back. // This is then copied into our own locally defined structure. // Note the Linux version uses fromStatT to do the copy back, // but that not strictly necessary when already in an OS specific module. - -func Lstat(path string) (*Stat_t, error) { +func Lstat(path string) (*StatT, error) { fi, err := os.Lstat(path) if err != nil { return nil, err } - return &Stat_t{ + return &StatT{ name: fi.Name(), size: fi.Size(), mode: fi.Mode(), diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go index 4aaef21604..e361b1d86a 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go @@ -2,7 +2,6 @@ package system import ( "bufio" - "errors" "io" "os" "strconv" @@ -11,10 +10,6 @@ import ( "github.com/scaleway/scaleway-cli/vendor/github.com/docker/docker/pkg/units" ) -var ( - ErrMalformed = errors.New("malformed file") -) - // ReadMemInfo retrieves memory statistics of the host system and returns a // MemInfo type. func ReadMemInfo() (*MemInfo, error) { diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux_test.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go similarity index 97% rename from vendor/github.com/docker/docker/pkg/system/meminfo_linux_test.go rename to vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go index e5a7fceef2..bd3c373aee 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux_test.go +++ b/vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go @@ -1,3 +1,5 @@ +// +build linux freebsd + package system import ( diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go index 604d338754..82ddd30c1b 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go @@ -2,6 +2,7 @@ package system +// ReadMemInfo is not supported on platforms other than linux and windows. func ReadMemInfo() (*MemInfo, error) { return nil, ErrNotSupportedPlatform } diff --git a/vendor/github.com/docker/docker/pkg/system/mknod.go b/vendor/github.com/docker/docker/pkg/system/mknod.go index 26617eb08f..73958182b4 100644 --- a/vendor/github.com/docker/docker/pkg/system/mknod.go +++ b/vendor/github.com/docker/docker/pkg/system/mknod.go @@ -7,14 +7,16 @@ import ( ) // Mknod creates a filesystem node (file, device special file or named pipe) named path -// with attributes specified by mode and dev +// with attributes specified by mode and dev. func Mknod(path string, mode uint32, dev int) error { return syscall.Mknod(path, mode, dev) } +// Mkdev is used to build the value of linux devices (in /dev/) which specifies major +// and minor number of the newly created device special file. // Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes. // They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major, -// then the top 12 bits of the minor +// then the top 12 bits of the minor. func Mkdev(major int64, minor int64) uint32 { return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) } diff --git a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go b/vendor/github.com/docker/docker/pkg/system/mknod_windows.go index 1811542ab3..2e863c0215 100644 --- a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/mknod_windows.go @@ -2,10 +2,12 @@ package system +// Mknod is not implemented on Windows. func Mknod(path string, mode uint32, dev int) error { return ErrNotSupportedPlatform } +// Mkdev is not implemented on Windows. func Mkdev(major int64, minor int64) uint32 { panic("Mkdev not implemented on Windows.") } diff --git a/vendor/github.com/docker/docker/pkg/system/stat.go b/vendor/github.com/docker/docker/pkg/system/stat.go index e2ecfe52fe..087034c5ec 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat.go +++ b/vendor/github.com/docker/docker/pkg/system/stat.go @@ -6,9 +6,9 @@ import ( "syscall" ) -// Stat_t type contains status of a file. It contains metadata -// like permission, owner, group, size, etc about a file -type Stat_t struct { +// StatT type contains status of a file. It contains metadata +// like permission, owner, group, size, etc about a file. +type StatT struct { mode uint32 uid uint32 gid uint32 @@ -17,30 +17,37 @@ type Stat_t struct { mtim syscall.Timespec } -func (s Stat_t) Mode() uint32 { +// Mode returns file's permission mode. +func (s StatT) Mode() uint32 { return s.mode } -func (s Stat_t) Uid() uint32 { +// UID returns file's user id of owner. +func (s StatT) UID() uint32 { return s.uid } -func (s Stat_t) Gid() uint32 { +// GID returns file's group id of owner. +func (s StatT) GID() uint32 { return s.gid } -func (s Stat_t) Rdev() uint64 { +// Rdev returns file's device ID (if it's special file). +func (s StatT) Rdev() uint64 { return s.rdev } -func (s Stat_t) Size() int64 { +// Size returns file's size. +func (s StatT) Size() int64 { return s.size } -func (s Stat_t) Mtim() syscall.Timespec { +// Mtim returns file's last modification time. +func (s StatT) Mtim() syscall.Timespec { return s.mtim } -func (s Stat_t) GetLastModification() syscall.Timespec { +// GetLastModification returns file's last modification time. +func (s StatT) GetLastModification() syscall.Timespec { return s.Mtim() } diff --git a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go index 4b2198b3aa..d0fb6f1519 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go @@ -5,8 +5,8 @@ import ( ) // fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*Stat_t, error) { - return &Stat_t{size: s.Size, +func fromStatT(s *syscall.Stat_t) (*StatT, error) { + return &StatT{size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, @@ -18,7 +18,7 @@ func fromStatT(s *syscall.Stat_t) (*Stat_t, error) { // a system.Stat_t type pertaining to that file. // // Throws an error if the file does not exist -func Stat(path string) (*Stat_t, error) { +func Stat(path string) (*StatT, error) { s := &syscall.Stat_t{} if err := syscall.Stat(path, s); err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/pkg/system/stat_linux.go b/vendor/github.com/docker/docker/pkg/system/stat_linux.go index 80262d9519..8b1eded138 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_linux.go @@ -5,8 +5,8 @@ import ( ) // fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*Stat_t, error) { - return &Stat_t{size: s.Size, +func fromStatT(s *syscall.Stat_t) (*StatT, error) { + return &StatT{size: s.Size, mode: s.Mode, uid: s.Uid, gid: s.Gid, @@ -14,17 +14,17 @@ func fromStatT(s *syscall.Stat_t) (*Stat_t, error) { mtim: s.Mtim}, nil } -// FromStatT exists only on linux, and loads a system.Stat_t from a +// FromStatT exists only on linux, and loads a system.StatT from a // syscal.Stat_t. -func FromStatT(s *syscall.Stat_t) (*Stat_t, error) { +func FromStatT(s *syscall.Stat_t) (*StatT, error) { return fromStatT(s) } // Stat takes a path to a file and returns -// a system.Stat_t type pertaining to that file. +// a system.StatT type pertaining to that file. // // Throws an error if the file does not exist -func Stat(path string) (*Stat_t, error) { +func Stat(path string) (*StatT, error) { s := &syscall.Stat_t{} if err := syscall.Stat(path, s); err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/pkg/system/stat_test.go b/vendor/github.com/docker/docker/pkg/system/stat_unix_test.go similarity index 88% rename from vendor/github.com/docker/docker/pkg/system/stat_test.go rename to vendor/github.com/docker/docker/pkg/system/stat_unix_test.go index 4534129200..dee8d30a19 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_test.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_unix_test.go @@ -1,3 +1,5 @@ +// +build linux freebsd + package system import ( @@ -22,10 +24,10 @@ func TestFromStatT(t *testing.T) { if stat.Mode != s.Mode() { t.Fatal("got invalid mode") } - if stat.Uid != s.Uid() { + if stat.Uid != s.UID() { t.Fatal("got invalid uid") } - if stat.Gid != s.Gid() { + if stat.Gid != s.GID() { t.Fatal("got invalid gid") } if stat.Rdev != s.Rdev() { diff --git a/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go b/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go index 5251ae2129..381ea82116 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go @@ -6,9 +6,9 @@ import ( "syscall" ) -// fromStatT creates a system.Stat_t type from a syscall.Stat_t type -func fromStatT(s *syscall.Stat_t) (*Stat_t, error) { - return &Stat_t{size: s.Size, +// fromStatT creates a system.StatT type from a syscall.Stat_t type +func fromStatT(s *syscall.Stat_t) (*StatT, error) { + return &StatT{size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, diff --git a/vendor/github.com/docker/docker/pkg/system/stat_windows.go b/vendor/github.com/docker/docker/pkg/system/stat_windows.go index b1fd39e83f..39490c625c 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_windows.go @@ -7,7 +7,9 @@ import ( "time" ) -type Stat_t struct { +// StatT type contains status of a file. It contains metadata +// like name, permission, size, etc about a file. +type StatT struct { name string size int64 mode os.FileMode @@ -15,22 +17,27 @@ type Stat_t struct { isDir bool } -func (s Stat_t) Name() string { +// Name returns file's name. +func (s StatT) Name() string { return s.name } -func (s Stat_t) Size() int64 { +// Size returns file's size. +func (s StatT) Size() int64 { return s.size } -func (s Stat_t) Mode() os.FileMode { +// Mode returns file's permission mode. +func (s StatT) Mode() os.FileMode { return s.mode } -func (s Stat_t) ModTime() time.Time { +// ModTime returns file's last modification time. +func (s StatT) ModTime() time.Time { return s.modTime } -func (s Stat_t) IsDir() bool { +// IsDir returns whether file is actually a directory. +func (s StatT) IsDir() bool { return s.isDir } diff --git a/vendor/github.com/docker/docker/pkg/system/umask.go b/vendor/github.com/docker/docker/pkg/system/umask.go index fddbecd390..c670fcd758 100644 --- a/vendor/github.com/docker/docker/pkg/system/umask.go +++ b/vendor/github.com/docker/docker/pkg/system/umask.go @@ -6,6 +6,8 @@ import ( "syscall" ) +// Umask sets current process's file mode creation mask to newmask +// and return oldmask. func Umask(newmask int) (oldmask int, err error) { return syscall.Umask(newmask), nil } diff --git a/vendor/github.com/docker/docker/pkg/system/umask_windows.go b/vendor/github.com/docker/docker/pkg/system/umask_windows.go index 3be563f89e..13f1de1769 100644 --- a/vendor/github.com/docker/docker/pkg/system/umask_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/umask_windows.go @@ -2,6 +2,7 @@ package system +// Umask is not supported on the windows platform. func Umask(newmask int) (oldmask int, err error) { // should not be called on cli code path return 0, ErrNotSupportedPlatform diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_darwin.go b/vendor/github.com/docker/docker/pkg/system/utimes_darwin.go index 4c6002fe8e..0a16197544 100644 --- a/vendor/github.com/docker/docker/pkg/system/utimes_darwin.go +++ b/vendor/github.com/docker/docker/pkg/system/utimes_darwin.go @@ -2,10 +2,7 @@ package system import "syscall" +// LUtimesNano is not supported by darwin platform. func LUtimesNano(path string, ts []syscall.Timespec) error { return ErrNotSupportedPlatform } - -func UtimesNano(path string, ts []syscall.Timespec) error { - return syscall.UtimesNano(path, ts) -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go b/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go index ceaa044c1c..e2eac3b553 100644 --- a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go +++ b/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go @@ -5,6 +5,8 @@ import ( "unsafe" ) +// LUtimesNano is used to change access and modification time of the specified path. +// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm. func LUtimesNano(path string, ts []syscall.Timespec) error { var _path *byte _path, err := syscall.BytePtrFromString(path) @@ -18,7 +20,3 @@ func LUtimesNano(path string, ts []syscall.Timespec) error { return nil } - -func UtimesNano(path string, ts []syscall.Timespec) error { - return syscall.UtimesNano(path, ts) -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go b/vendor/github.com/docker/docker/pkg/system/utimes_linux.go index 8f90298271..007bfa8c03 100644 --- a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/utimes_linux.go @@ -5,10 +5,12 @@ import ( "unsafe" ) +// LUtimesNano is used to change access and modification time of the speficied path. +// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm. func LUtimesNano(path string, ts []syscall.Timespec) error { // These are not currently available in syscall - AT_FDCWD := -100 - AT_SYMLINK_NOFOLLOW := 0x100 + atFdCwd := -100 + atSymLinkNoFollow := 0x100 var _path *byte _path, err := syscall.BytePtrFromString(path) @@ -16,13 +18,9 @@ func LUtimesNano(path string, ts []syscall.Timespec) error { return err } - if _, _, err := syscall.Syscall6(syscall.SYS_UTIMENSAT, uintptr(AT_FDCWD), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), uintptr(AT_SYMLINK_NOFOLLOW), 0, 0); err != 0 && err != syscall.ENOSYS { + if _, _, err := syscall.Syscall6(syscall.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), uintptr(atSymLinkNoFollow), 0, 0); err != 0 && err != syscall.ENOSYS { return err } return nil } - -func UtimesNano(path string, ts []syscall.Timespec) error { - return syscall.UtimesNano(path, ts) -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_test.go b/vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go similarity index 98% rename from vendor/github.com/docker/docker/pkg/system/utimes_test.go rename to vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go index 350cce1ead..1ee0d099f9 100644 --- a/vendor/github.com/docker/docker/pkg/system/utimes_test.go +++ b/vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go @@ -1,3 +1,5 @@ +// +build linux freebsd + package system import ( diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go b/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go index adf2734f27..50c3a04364 100644 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go @@ -4,10 +4,7 @@ package system import "syscall" +// LUtimesNano is not supported on platforms other than linux, freebsd and darwin. func LUtimesNano(path string, ts []syscall.Timespec) error { return ErrNotSupportedPlatform } - -func UtimesNano(path string, ts []syscall.Timespec) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go index 00edb201b5..d2e2c05799 100644 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go @@ -5,7 +5,9 @@ import ( "unsafe" ) -// Returns a nil slice and nil error if the xattr is not set +// Lgetxattr retrieves the value of the extended attribute identified by attr +// and associated with the given path in the file system. +// It will returns a nil slice and nil error if the xattr is not set. func Lgetxattr(path string, attr string) ([]byte, error) { pathBytes, err := syscall.BytePtrFromString(path) if err != nil { @@ -36,6 +38,8 @@ func Lgetxattr(path string, attr string) ([]byte, error) { var _zero uintptr +// Lsetxattr sets the value of the extended attribute identified by attr +// and associated with the given path in the file system. func Lsetxattr(path string, attr string, data []byte, flags int) error { pathBytes, err := syscall.BytePtrFromString(path) if err != nil { diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go b/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go index 0060c167dc..0114f2227c 100644 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go @@ -2,10 +2,12 @@ package system +// Lgetxattr is not supported on platforms other than linux. func Lgetxattr(path string, attr string) ([]byte, error) { return nil, ErrNotSupportedPlatform } +// Lsetxattr is not supported on platforms other than linux. func Lsetxattr(path string, attr string, data []byte, flags int) error { return ErrNotSupportedPlatform } diff --git a/vendor/github.com/dustin/go-humanize/comma.go b/vendor/github.com/dustin/go-humanize/comma.go index 20711c152a..b65ea6fa78 100644 --- a/vendor/github.com/dustin/go-humanize/comma.go +++ b/vendor/github.com/dustin/go-humanize/comma.go @@ -33,7 +33,7 @@ func Comma(v int64) string { j-- } parts[j] = strconv.Itoa(int(v)) - return sign + strings.Join(parts[j:len(parts)], ",") + return sign + strings.Join(parts[j:], ",") } // Commaf produces a string form of the given number in base 10 with @@ -97,5 +97,5 @@ func BigComma(b *big.Int) string { j-- } parts[j] = strconv.Itoa(int(b.Int64())) - return sign + strings.Join(parts[j:len(parts)], ",") + return sign + strings.Join(parts[j:], ",") } diff --git a/vendor/github.com/moul/anonuuid/README.md b/vendor/github.com/moul/anonuuid/README.md index 8df95cc8a6..effa9eb5ca 100644 --- a/vendor/github.com/moul/anonuuid/README.md +++ b/vendor/github.com/moul/anonuuid/README.md @@ -17,7 +17,7 @@ times, the translation will be the same. ## Usage ```console -$ anonuuid -h +$ anonuuid --help NAME: anonuuid - Anonymize UUIDs outputs @@ -31,14 +31,18 @@ AUTHOR(S): Manfred Touron COMMANDS: - help, h Shows a list of commands or help for one command + help, h Shows a list of commands or help for one command GLOBAL OPTIONS: - --hexspeak Generate hexspeak style fake UUIDs - --random, -r Generate random fake UUIDs - --help, -h show help - --version, -v print the version -``` + --hexspeak Generate hexspeak style fake UUIDs + --random, -r Generate random fake UUIDs + --keep-beginning Keep first part of the UUID unchanged + --keep-end Keep last part of the UUID unchanged + --prefix, -p Prefix generated UUIDs + --suffix Suffix generated UUIDs + --help, -h show help + --version, -v print the version + ``` ## Example diff --git a/vendor/github.com/moul/anonuuid/anonuuid_test.go b/vendor/github.com/moul/anonuuid/anonuuid_test.go index 250ec3e8c3..334af6614a 100644 --- a/vendor/github.com/moul/anonuuid/anonuuid_test.go +++ b/vendor/github.com/moul/anonuuid/anonuuid_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey" ) const exampleInput string = `VOLUMES_0_SERVER_ID=15573749-c89d-41dd-a655-16e79bed52e0 diff --git a/vendor/github.com/moul/anonuuid/assets/anonuuid.png b/vendor/github.com/moul/anonuuid/assets/anonuuid.png deleted file mode 100644 index 6c631348bf2092346aaffdae7fd20f2e7ddacc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48977 zcmcG#WmIHAvM!3dHtz0HxVyV+V~s=OUN|)FjWjgwjk~)S?(XjH4zFj5;ql)JyrYb+3m6z8#y@`GU}+h+U|^7?)*3plI*JN>rVe(@#%2yC=FC7l$G>PW zFaaRn-=dwlt1&6i&eq$e06aWAm_68;9h@xzth~Iu02Vd?8ynMK1e1%W zy{j>h$=-$HzZ&`Pb|lPQOr5PAU9BDLN&nHVv5AA5s~|b~KMeh!&%gR<=lFjN*}MG9 ztH1sMfX0phR%RB!|3-4Pw)mg!{l8fM(EML%=0NNJ3+*48|Dydf82{Brfxi*uQ*TDLeDu?|*Us9r17EfB3}+lRH^Bc0qY$eA;Qu50PrSH;oujk4i_1Uood3fA zyX-&lYUVBuwr>AuUen&%Rfz3hl>ZR_CrkH#^g`VK&G~oXe-d>5H^RRQ|BdjE2f_Ex zNa;ve+nL+{moF@T1O2~h{*x*0VC&$l?r3ak{*QqDlk#t(|3v@Oj_&{1VdePi&i~l? zH_gA80)T&H^S@>He+`{~O8<@>A%wrr^uNcU5W;0Fc@-F#2$-yds0I-HEE6_EWB&f> zup@PO!`qTSM?wAfNzDX|H?7(dPjtiHSl>hF99727v ze}#FjfCFOvgq5>eWyj?Hik{X;1LdW6+E|jQ&D35gVS}YwC*WBmZ~<~#Jl-%<^0yjh zQ!d`!B&7rhg&QAMqWGlyo8&kv{Y5{iWDLAoQt>xQ9Q1 zFRHQPBQZ!fIoiRWB9ibZDoLcl^lWNHMQoaJJ`zf$rGza9ohMTFd~WtB@$j;P&i`7O^p~B9`ABdCP1vTW{o2>ddOf4F$S}4K=>i&Cj6n zZ&mC`{`nr8=)R|A^aX+N6u}^=N%fnLiP@VqxG0SzZL2Ce%=;9rO~wUV)T-w6)`Dh_2$mc3;|G0M*;?t*_u%30`V)WDit??S`d0R=W_YC}prI*` zk;%|Y$!HZ+gZf-sr=WuHaq^B5eqi~E{mhFR>N0|%E=g^YAYdjrAR z+T=sGdu9VUVDGxu#YF55(EVM#yn9$ZW z5Lky0DHIEzK_EH|Cx?P2g;QxB1f~IHs2C-TI8>-O4~#glx>O>hSWW>h7MmwDj9w0x zZP`${?OsXS7x|`b<(R(2l`m?czzPcvhNFJXmV{ISg{FcgLi+Zl0i(IN6;g z3l~f~@S*|5hv&}{cBZ^HKd>xY)tev6MkoIo^=S}kGY=9ZMzJx9#Dpfe*p;+2!DS=Y zw2p+hR8%sWKgx(MU@(n1oh7b9EaB);F&fL zzlG}0zY|xz`SYcy4uYzysehYs$=<{Ex0Zup%dkD*4-;aJq)fxEe?#;=btjUDg96(S z_~SsB)H)HilXXF!K336UoQZ3aqSoq01=nDjWbz;A?8UT{-rSAo6TtvM!EiBcI|#2> zBg(=3eW;Vk7_B?gs~c%rJ}Rrk`A$pOMDtabP_okdQ6jyvc6ITb=6 zgune9%9r+};J;x0ndr#? zA+Z-eBpgqcSI()a`++WKIq>5%vm><9CAxgp+^T$Rl7b45n73#{fwQ{!)o0!$0fnR@izc= z$LQp04`N6Gs+Z+cbjr*8t?I`ztk?k5%2bYwA=Q#C-pO#(1=MD!Y)63D#j+H+&Bo<3 zsyn-Vy?JD#s)l8)pH=v1i0Z#DbW(kC{%hg|7pB{a_ef&>pk}5#IruqL7o_p1J6-C> zb3?Y-YnYYEB|U84X1a=!Zh9}b*T;Qtp{jHqlKz>J0j{{+#G?Y~2sT&*+M_y-p+P4j zA`*w<7Ok>aTt^$|UKo}8$M^m@F$Re`P=({GWa!^ZjQvfdGMpjUCnT6;lH!k~(bPP;d z)3zckG0B{NZpf6#?zL$qOj^on_A{Hdp3t0>Ui&7R0uJG@zaBPK!bQ7cIT+b za937>qy7(7UUs$l?C2jP#HI8#=@k#Y>9!AUQH%@EmkS(k5`yLdLtnvj?^!t?&D8Eg z3qH8W$xi~8uDo}VPu^{3R4lo;D*T!j?grSR3NG=+ALr``axWPLzVc6o$s)DY=<_gelvpc$rX@ih#$&(aWdrFzf zHB|fVB2B)Pr{ga@%?y3TbwHb&Z`Id4Eq}Pro=^AJx491<>i->28yx^wYij-@0^GEn zjDzE?XX%Rl_{@{9DS@c?$ZS{HtlAJAKe(1+Y5btzk5p3>vfPE&a&Ue2xNz5RrqRt3 z)^YL3%Y0%y7j$N^Ak&`k`zy9)d|~;R$#aLf?8$?o>9a^Ble6Ww0;#J|SsntppfUTD z2GI>dr&h%)Q9;*Yx@z9WaVwV3J3H}N`jcXCj&1sPVJ#4e2CA&d6qHXIW+JZu?a>OY zW=r(ZS~q!Homb*`qg}&5{Xt|9rHghkL+ni&c$!Bx*P=J;gW7t$Cuw;8Ysd+9Q z=AFm=H9P8uF#HFSu4Tjd%Yd!koqL5f!fthh&x(}Ac88%bjI>@Z!{y)rRW=d&lU0JK zKTWdQGJgXyyUL!CXuFsQR~^x47Tu8tUBuy+=4PXvVP2`-OLC3VUin8ZX=7g#9hweTq+8dc4(xtr1v?6QuZ2A_KIO0Opd6SZ<}ZS_<33|wvZ zZl>bV@vNm}AwAtVE)T_N+TJwteljKMBR+0{w zXT*|?9D@5}a6zy5`< z#B_q>PX*X+Fnk%qy;wJ|bEr8@5=6GQv~E~8(Auj`Idffl%qGIbO!^KdgTOiEFR5r! ztAOfs|Oy2`a`*S4U0#$Z&;Ew8N9_-^nsUIn4?S%RIK+=~J5QiqZGSw$$G*`=QrT7? zpS`>2+N!+oDEyoT)*Ag8M2%S_VD9$jL*1qQ3d(-=xiRt~tz3 zvmqBL$IH*Nhm!PE)r{UzKde?=Jk##bhhbdB?yeKFuIY2rF4N+};z z*l-rrnaUQmW(iokDQ744Me?SBd09S=2%>kM?W~$quJU6RIw6=6API*KhL4k)xg1k! z$>rm=6IV3+I`1vZT6Y5hVGkDXC&GgU7yk3&`wg5FLRk5EijSnH(h0eXU#qo=+*_V) z{JpUbCl%Aphm{?EXJL2w=v!S;Y;mH6Ly!&_ z-~I_M2|6sGi3^@E(y=}~yz9Tm34<2wdlwCudU8CHzqXejLA%o31Uyqa8h}+Egy2OG zkidV|DpY2IM92QhqW~KirqGD{LW4oiv zVqN32Ri3;tao84}I!-MZQ2c1EcK}rhgMm6U0LMF;s9a->E7RN5)af46u_I zbsu?1`~mSH!HS;KBcjaui%pP;tAP)2-ZrvUKO+p1^o!jS3VV?J22UK8-%qz;kO7IRB!f|2HqLGxtmJp2o+6!#w;&0|>M=);eKF_O#w_t5c8KkO_Z2cnSz8>yeMv zbJBWA;*sD9O|-limx(2)VduZMJMf)fDBtTHH0|BYRW1T|>Q;4Q_DX0R$;z11D}TnD zPgL9SkDWU8m)xZbu+2DOC7Vkm5}L7F4;5h=RrEE4I&pDQRkv~=Bpun4Vc;@Xwm+%5 z5-R;u1OiwL@42riKzb#lBCoQkGdqlo(xzu;HM6Z3Z%DtA^GI3|UvscBF#-MUS5E7V zUI&+kWI2GuXpnbFYO0kzj`S34q`RMTK6kDwowz@(#?eVWW0qxU(r#wB9fswW`RHl4 zQ0wVn3V|cit#)Zwly0okrLAjsSl+ej2$RUjFZ><@dMC2^T4<`miZQaQiJ33Tpj>zJ zuDuEmsnE{;_xOOTAPHKpNNSGx6t8fI7neM@c-%SExr4&X-X7X#J)gT2IFWcr6a9w* z#y_)mZrLCl}SuKhEO zZ}oG3-l8jPUa9PG3BLh#ZI9H2%HV zK}aGP@a>`F`ZkvVJ`&@dM333 zWo!L+W$4`cDl_Waa{E58-V?ZD;o-kXGRqV16u6#dU9`yj63l4aFX|_I;{wPi>;E_e;*8UPOB+1hv*3A^w_L+v2pn>k z-p}@(OH^>yu`{k&qidI35!bO)E)Sy(m^x3yyRwOpb)4}f;Av~~T*VODgsmELFcItlfFuX3g~IC;N!3>z$t@|VJio4!TF=nAjh9t~x$NW` zILs3=`U2f-aLTsaW22$0UJqhi1?EUJK@GR~9`TAScPj1%s z3Q(iEo5Z(2TCg%-n7xA`m_oNs;iuWHui0|6B_H_me~2wz&J*d!)DeBfUv}qKSs(S^WcFaUw_6#8YDOnK?EK$$vf5K@vXWaTYXfi(e|W^F1gV(tU+VeuOaK>P{~F1NxHrwS$tv+Oxb=&VcR1 z*N|7@NM1<2yG|oWz1rn#DUFFQ1(hjy*M7|;le;#kv_0D8xx4?P9W2Nej>q=2x$Wx3 zsN7Q9!XimfxZ@~dDO~yZQ>Xhf#w2>5`*sH7Q0+lG!1jWNT20q|- z?qgnkJuar{awd8%iRxsDNENqL_jDp$hp=dp1qMzWguxfmKWlfdPZJ{GnaMJftfm>C zy*43@AIH%C5m9dt?UT@N2k!={*Rt*7)gf+E*>r$6z;u?O!&soH(MbrV4)a@5N~f`* zS1 zW7hoXJ$HeLxy!m9wFz~zKDeRw{pF@`#_a+Jnmz#hu_(YFVt3fPF8l7gwW*@}iDbK$ zy6n-r=gGZIqK2mZi4~@o6Qygx8QRti^A;7^i#P2f+m+>uvpWAf^{O$|b?+cp-1J0Q zx2X-Ay3m$pCG=VwBHGv2%&})Y|HJ!w5?Ub5)_C3S(daL!e5bwNtfolk8jNrLoXyd& zA7US)i3tfigK;FA*Z?^lAgv>}XEtO3D(bDrB#pa@KmRy!GZO(G-fP2Tzm(5dCOcSH zG{Y3dc%n-EQ1ebHjWXhV|uIKtKTaqP|PaRAK%cvp+gHN#Be(e8?cAA5%y9 z?y0|oXXBUDpEX^?XaFO#QEd^jDcbI*O^;Q(reU6@tikgg$&J{AITzIGFU2qgnVBg@ zex6A?88t40Uf*Af(9ZQ(X_%aZI3wb5;R#XReWZpiquXa(g{x5E zDTI)KVJ#O2E6~jyIdGEvFBff>7nN7P(Dng__f7TCK|bEwAvn~Yig2|=zbJdHv9@|* zh8@u%M!jk5|2&k(n95pN9U+dwzmnb-ZgpW@{{*x#Qaz4@-jl4Jw8KkRYeA|-tOs9ohE&1c=PdZL*$ zyYZ0VCML-MnL_csTAsDhGRky9QH^M+uW378SR>~0ZO_O9&NoA6h@`TZz6w?C3MIXy z+TFd2R|&x0Lw;lme4i`sue_?F6W+bZ%a}7Neiao74x22A?Z7x?PaLJ)vZ(Zv5uW@G z>5zSTN|}$#`*(g87I;TRLh`|oOqNYQr@L2rj*5vUcp~3_o%3YdDl1oIF%#081$eTW z`yq$3lHS_GZfRkfGlVXI2Q&7-M zgMdd{c*02=o0Q5@QlM1>!bGLjoR7uyYo2f%y>*vpDg)K~v*_owi%#5TViFG=aAN1i!86#MK9#1ZotC@KxuF4n1~$`Dy}n0ZN%z%|Vdj zNaCZ0*63>sxrjmlQc`(agh=_w#KZ@ekdR@M-D+d;%E}5uR8&+^xlz~0_oSB_k4@i2 zrK~<#2Q?kW)i1%5?R$G>{KE!XTG(cF%fAUg4BU1rckq)0C`Ivoj0~X@VBPRX&&&f@ zTg~vIb}(yi$4TECzH0Y_K-iR&luO^N9zWh+?+XhHkFlf7ZB0#g+ax6=nScANEE@T* z&!I4f)z|3Mba=K*yu)WbJn*I1(CrtLM=Q2PIQpstOt{^%V{vB3TN6~1Gc!++v@;h( z!(~am+>AR75?NN2lsK_H%%r&Re&*EH-cY~P26rwEEzVQk=|f0B!@~NfWMvtm6A_(< zcDZ^#oXG-IVm!N)!^b`A%blxdkIPB3adCwTHxG(pcB>2&H#v14RC3@P!O#QX__r?| z+lQ>6-f&}Io0AU{B%H!wf0AHhb9p{pZQoyI6MP^t0svjuSs4hIQPp2d?}^9^!nFA~ zsi+F2u8Ne_FV@@oa%YFPe4%gqfBpXbMCzjk6Yg}TUQ2rbP(vaEAj5GS*fp%|(oq6m zHH4-r+TMd&L*;I0W`yH0$dHkd?clYEiL~&QjwiwKO!8hd}n#w-xW=M+ClLBVsD@HPgg$_dVkxwK^+n%KvRAuBn@Nz>UuqZlj72e zy7s`T6eB`)tC3%#40P*$^iXNC-y4d@h&P2}kWUGqB2A zDRXtI-k<4nP-&kZd>Sz<(=3nJeWXm0zfII>(NAlUHY=1r1BOB;7PYX|4|Qe?o`M*U8Ry2#2J?B4bRI>*hlXalG%@-N5&iTM z*rMAT%_GY1il4G=Fyd=Q?UhByM8u%HL}eje&^MIG?@V%Z?h_fjG%lHu&TVPMeJHiR zz=-g1)wKDK;V-1gkc9Zp>t`WyrY(+IiNRGNy9R8_X@9?PRGZbT}*WKHIC9%i`2-q~(ew6yXzm#0{y%@B)zc-YW9IG9S zD&sBY~bNJ~MM#zjdO@bt;j12Ty!)pgbyg{UKD3r;1Gf$r{s+aRzm>ipY2`*N1asO-)U0_E;}cIEuye#_=Oy?^fo`VsL+w$0Y;6k9zr=j{1pXco;*y zO%q_}cQ6O-q>+&tr)gIoXJWf~LUzqqXp`$z^^^m@=^e95RPOFUmfJ`Y-HN_|ekYEu zg*bKS>;b`5KTHeu@<98s>)Oz%{7HR`ou3w(H}!CLqOw zq|MuuPCG&#$1TpkCrb|5C%gm3huR`@#lxs4f3xmto+w#nt%aY_b%U+MUYF6eGoNA# zgQju#8dC>TxW2fyW}mvu3i}At*$;&a78a?g(vgB5jEjO`%E}t>?nkH)$C4|OaKI~A zvvk(-1L<`!i~}}cvDtO{(3L1!s>F-qz6`|Xd@0jspoyc5D00DYgqR``n|Ib%YYKXosWXSzsi9NCo$U;i0&u0Hwp4*AG!~a3iuZeL z!WmGE2(J|6i}Z7Bco^Ka7iJEI&%Hb(k$jb=tGSOLQ^UeO!nQ8amH}*v9gUUa!>uOu zHDME&Se1H!w`xDYMFE1cK{JJxmdKZBt2#_bp|rBHa%&|fo=Y5)&+tXYisefujzbkZ z*|NlubDD%Tu8XvvU#Bz>eR(NZ4Cf9(U?{R37yj$62JBv-I}~gf3%hZ=ZWHT<0m!e3)Pj5m`s-~M!3z_boQN- z71>fHlgT{Xy7H?KfDweVtf(`Gv90j_uiQRB~vw8)xs>V%|5#7I)r~dpTh`&ae5Yp|)3SG1CzT5YG*DxafgWqI^i%jsiLUdaqe&8l8 za4A|`mu;_l1kShL-ef~?IQ<)Vv=V%+01-UL7i=d8S?7K*ma3K21$_qAe?rtBkkwyD z()@tUv7@K}77EU$8#zocc>PtZ;c=^F$jeZ*Zr(k4&sb3Yr8eNO4F_Pzm{lcy0r|B) zU^Xa0*iNQLJ`goPM+7qnD}y<7o8)VU*L@<~-lHUoi&6SohSyBYTderEcOuZQh*kUV z*s=E&Y&_pUNG)MudP?c6HU|^xi{-hST?Y<_&h+fx#u2 zA3M;Ub=|iDNR2W{GbmSFzIW5oY{YC*G;*0b2W(P3j1*SB@mGHY5;frAd;umi!q3}b zB!0m)w>&@%7bDY`Ssv7W{tswy6~wsra9BoDrt@%eXCGxEz@gvmsGLnA4qftj z$=~%8a?3m#c(eyfLnYJ1cRi2Qxf4ikkmsSH6ZWYDBjjA`6ba}Tai2wc@b8we!2I-c zO|zmY8#*W_%a;~nDKdcz>;yF=aR+@u<0?L~qh|A5w%=|HdSk9}X7Jqm%=$nKDjfn& z`v_PrO08X(5NZiu;IiF+zik7;^3L!HzabU$D!r1FyKLTy#aI)04jf^%++h0dJAPAV z+U3Nb0&0Mk!ZB1K9WIhsA7BB1&QDVpf|*!aG$N_>U(U8l`x4-dWS4#t8x2D;!h`*r zTx+z3sqz)(hi+?#0dZZ@$(%W^+-!#&o`9psn@@@>Z;=;rbaae&{%og?!?LPQuMEF- zMPYnN_r5`M+y=Qi!bQ&84kEtDtSNNxl3jt28~jao$)f1oQp+^!vv|(TnEZOh6IXlB z;~dt#$Fi6wCU3dr`;T>br+DkdUs@61d#o3{#9AlVAxgH4rdiA6L6@pvKhPoL870hA z%v3y#&4&y832}L>rgF5o?AL&>htstE6740V6CrpKv_pI82zzLGSrWAKy%I&uZGmVV zezynXgH9hdSzU19)ryecn-58o`~?R+nqwgz0{duylK@7&MulFy4T!-_t{d7<&Zz+I zYc6@XFHY6f*xw~njRGH^$+xfQlU_6&dKCQ7$v-8w$E0c^RNf(gU`LGbf>48rfl)cT zf^h8}^%W|MO64Y(5ewD?QK4DQ??2mZ=7sC80Xk6IjNQ=4h}Vvkm`rcAu`161Mpg-y4RWNh zsd*5ka11<JV9~D!5gep)Y;!H}^(btR z_2*3jglf3#xXmo=1>w`LXIfvJEFqF+M3rTkrk|#q_gXetOp9WZN{7QZ!|#Uv<@GEP z?ZyGhw?ri=E$j9U1%SXA9MHAN!43|ib!ve+@I+|~8}#J)q8j}z{kYK9rx#IQ;8r`B zcR#9SVVKv>Yf`<%SLPFuz9DYTpF2@$oP*3}uC<9h;kq6;B}#uabeextM{ynvU~FsHP^OOhq0>1eHh(a4Rmlp&jF zQMkT3JtJ-GOSI2hVYULn@}?wd!`Pc&!RcOEeg>(0sxFYq%72SoR>=6;-U=pm+@g;v z_HBeTOom7w=L^ag$!v(kamfRyygR8LT;-~-4c{rZGxd~swu2D>FgHcWX;U3gPyvr- zNu_XW@CpxZXB=)d(`5;bAK?LQ;A;zHaE;%wX`Us(gLmicpa<2gYC>&{X8hPfZ17Z- zNHRPRQgH`D5mpSU;DZhhGaGB3pLW+T+(t)WVeo%pDK4mtG?Y!@fdyx!)q}p{yevR6 zAw;-jUwJ)kheaJsWO@^C&kCC!34p_OP_d~D@GaNbzMvcG4C6LN!<#ZySsV2Hp5L0c zKWKsPoMO%5?xW~43&Q0PfOe2srKFHk?#-!zizdLm%^v#1LZBwfb;5^GUI2Hffo6Dx zfyM7fJJ!gN_f0^GOw+t{mNk<6W)9xlWK>jG*mGL>$pT~AvS>)31RK1ZxHX6-b}nY4 zoM(h%b+}coX34U+VR}uv_&IemwFv>W%W#!ytMrn3jgzkIl`}nDau3t@KbWSHfyV^JxC<8byLtlgB{Jl$}SH zh4fJDRU~ukpA35e|x~AX!&Ik101fRIeMz98`WhEY`)p20!@~OBu1sC zlJYQx`Vv{3J76#ES>1$!uLMyGUkS3h#1_5|qdd)qZn+74OKfG8NJf`)?<;<9p@A9o zLQ%q$6|&2K#<<-6n)k&ta8(ubDY_N0&6)^LicmW%LA1#hp^lEHcD2p;;Avzc?O6&JIB!2Itnly*CmFh~$@ z#oMa?35T7!x1Ke6U8Xn0s1|33zuYx9kw$hYIf5H++k)~Y9*QaMFffoyo(gjDjlY-= z3c4#m9-Z<_>QpZ7py(zlI&Lqlx0TIwZwO*juF7S1nOD1y$if0JND=eU31V)#B&>7o zAbM2gm()$v)icf%@a4E@QRPu8cow^I5@JQ+?o|HeQTpj6n$u>X9P~3oT&l+d)6wm= zrQMfIHIxNOL{r@=+LO#q!P3tROgy+sH6slWjlni%`MaW405Q zp2>8?^K>pa23>E@abzYW0Hu&>)WUp=BM43wuW1d}$S6u|&`}O{QZ-r+{*mrh6O8K(g>l{-qqyhAlCC~u=mn>&>?T{SR5+-KsKs>RTGvqzTb|@c4!2qP?Y6$!gXXA zo?#%pC#HU6FijVGP+T&(EAuKeSz)pFet<=H=-50ehWwqQD9w0N-(V3ntm5y11bNS9 zW{Kc3plIG(J!RJ40GRdjPae41YH2Nu!kJNwu_T^K@AJxui;_ZpA=dnc*7A!+7|!}S z7^hcc!x$8_;9d<;rdpX`5VoT)ZeToj&-cTEWFroR3^(MPFG7zHF61^aI?#OFMqH># zbp9ReI6aoLPmdR_o-!%4IhHU{pY8wg{M8ZHSj|VxCU%Cx1An~@iq=vZciYsGV&e&_UlSO?yBz; zi*O7Y8hRxs!YM~Qe#nM_>MY5AF<&edQ9U9B2gE<*wzsM9E~yjng%xemKa;TLreJ;7 z6WIhgB`?FrKB(O(Ahz{!+wNUVkQ(=#bmvwfFaolfq+bFfv(SX1iBdUBZ*2n3^vA7jF5!*PoRxDN0GVCC0yvoT{2 z-O|@D^}GN{+Zxq#18skMgB4b1cMdTC(ao|E&GM>?R4s&k$cW2nk=8?z3H-*{Q@2Eu zrZIDXX|)fX5$&~=El?k&w%CNdIBkKV#_pDHFkzN}K~&)6s_x;~aq(r+bZS1ic(2U} z2Jbk;_Y&b?w>dGfs{F3ki?;YR0wft%Iv5H-gi}1Al?gLWa>epYs2h&G?)sPwN)2Jx zzE|WuJ`R3Z52aVx9SLemMKQ^Rlb}}2h~IpX1(XgyPoP^W`;EdH;*JlaRS@Z8QdJ8o z;3`sCK!5j{K40Ew*Lf0@!)$6eT;`6CTyn4lrF0<}I1(Nx8fZf3eZ%Tuj-oZaiQP$) zJ;omq3B^uh(vHNGeZ|+T*;VCp0FbP*AkgUW*~~?ug}rp&mknq;29;0!JTqw%2g#Ue z$ou>DPg%C7J%0pnZ<+3IEWZ(AT;>_@c14JhMPK_I)J&OS$t@yuHO@hk06|25&kL0I z=BMRuBoqZ+Ip1udSx({XC&@XCc?r4T67YX+C@g+CDT)F`}<5c0b z&Tk5pak(w|Y(tpu1BMsMdc`3&OF0W2>4NBN6rC}1J+Q;P#FD+6n;`$_Or(kPJocZs zgb&94tbF`p8?r_cU0b(}u7mcIDKhr8B2gew6vgz4N}&M@da73jPHd9*aeyaWy83%o z_M}~aI9YS}7J@OdrdYL+TDJ6Wq94(#Op^p?`0;!3j#uWv3VN2e`j_i%+SJ2}wuB{o z`$_5tY`iBe3oj=JUv2WUh~75k$Q*|XHfm^tLO$x9o}HdqEs6?%JJA=Qst3@@OkXUW zHdPYvY0Upppru=mQ!Uuu6U}9BAEG3qOhvnS`9*so8(kH=Au&uJJ&UP&bR|je%lqra z!|4--6vO-&r+4v6fFIj|=!U;#p6r)t$czvtg21y}7-pJ!H;aUyRZCB-C4yqR>1(iE53ekMJ zp}4)FdEb$=w%N0RI;_phTZhbrSqJm|c|vIR|r6R9X*(q#_ti zBhY7h5u>xCqslL}RGQGg0+WQBe0oRK|1RJs&>gV*vj!~N)@{IFFtA$fF*q>Yz+j$kWB$q6ufTID zC`h$PpSNt99KA&_U>&EQZ*;a&<+42I(ItKK{hbLtw@>Bhd2JJJ=^Em2cN#81s=V@2 zH9Akh66{N38#dZ@XOd_F4k`g>Pw3U^NB|0mLUnlzJw}DW^xJBK;m{}hvkO{zu7VB$ zj5s0%S+JQ&WRuZ=XB6925i)LFGJRwq=0pWhHvL<>98{BruZmc4+d!TKaICis5zKj* z^oJ5=G|l;1%dM0WM9%QyT~`ELKdu1VvWD6BL7>xaE;T1kRftx^mP0?TEN{*URqN&6q=EA1#bGih_}Cmw1Rp0|jf(6cJfsAyAPw zRWDY4T}0kIVg9C7jqc39%WQ zY$Q&ice3|ER+4%-y9X}77)gu1+hdyaGSU}$Laedxs>vcfl1jm_oK%b#8CFljU2K$M zTSL8cf6}KvG822|th|Lb;bWgFu8;c5@~$efbB^2F{tN51&4(P3A2lnI?*V{9o~bOY zyiA_qG?_e+tGcAYAZ;~sL3k723U~-!CjK8OTPl*1tZZ5CBh+7R^4-SlQ0e1+GMnvp?Ssb&;m1Y|BjykFiOEAC-Qyh{C)y{Xj#|Va&~h8^neV z3V7m9(Wc;-lzMuD`+H(MPP$qKFX7D9{y7KwndaxGd(zOi-~+Igud>8su|B+K?sTM8 z!j8pBlZYb?*>=t7&YxmV?L&qEj9eR3Xv|e2x!!t<<>l%g}oY15Qe zNhjNc({pWJSSJ6fxgC?2l`w$&o09zhs{pPPT~dvzM-Rt3@3UMZBXorE8hZpY?mp@D_GH+fVxW;#!6}(r&Ay%u%+FbNsN47@uDMZ=Xy; z^yge*wRn?e$O!UR*Ocy)*^rZ&Q3(~4ceLpPekO#^CiZ{0=%`*OebI=gpUjXB;~=>f z-UdW;6uSzQQUR7bq}s6u~^XJ_`+BZT0s8iWp8quN}!8!*BSC zr#`!`@Bop(r;ksZ`_Hj#*6Xf^Ai1}%l`4O_x~n*cddKaC<3^d=Y}s#}xO{wtNI-Za z8)T`FCIa7U8Pjgf%=Q`&JZS|u;CUcHJ|;3P@rHYI*mZ!&;ESaJe0Aiy%6En zhSu|az{L|?{zifEbrc?BL}}kF%K#xGyjD+EMhhxf$A_u+3wTSg>?63=MrOI*2PD9X zwmP)d32uUYm_Nx2U>2koXzSRvpR9-7@wnmbVqD;2IiBW*ibP}NSeNi9b%T_j0yGrr!1PT@*`=kJ=mDpDWcw>3f9 zGLx)^RJ4g3@DMDM>LD9cvsU=i2c_to?3S)yr}QU6F}o!JEdGMnw&;UITgEsRH-#}p zj~7TGSCt-RCrz@tBI+y|jhT7wnB#7D%BZbujFhI%L7qH7g9`@3xg!u5Fo7*mN3Sz@ zI2F30vq1TaduQ??{GBhLs&e>CuRV2L=G&%8xL^pnE4B|g$&n01-Z0>Db95EOvw{^X zH=yR`%f1qInhPWW3{mvB^9XXz+Izxh&lB#uFyn*T1=FAmn&h5KZR`B!RY(KgFa8HR zee0TXN_`{vtSnjSbQ%ur{#P*O=eK=w&!E80@Aba1hZI)Y!1VAc8=gTIa7fU8(N$HH zA5*BM*&0Rw9<9r>eJ}Y0Vjyrtznc~LCvrABi#;UoFR-X0WFz1ceag9euNTdGP3?u? zh&>FS=E2@HRRzEyNg4D(P5)M~sTs~xUM4BCsrb2H0r@nw*Ne6&Ug($4au@JCD&e;i zf{$wmFg^sm-;l-HC8vh)DIq^-w}%me?}%t0!f5lUFd*rxTn)lf?hv?bBuh-!*ZW}= zHl!l-WpLGlgD6wKZPxJX;5rhF)nbFLfPX$3dn(UhFz?N61H6a_9I@=)24;H$NuIrj zsaQk_n^F4Y84er8aWhP%H%Qx08#%q*Zgi&#w}5<)ATUeMc|a9txT!m;I^h|=$Q$PU zj<#rGB}ZtTRKCym?_WRUb)>s-a;X*DJV!qhHwUGnGrl(_O&y^4U+thW{;3;%GX@=r zjv)7*_-WDq>M!_+A2-ChD?w^y`eCmHG^3DO3z9(nK(GUlrw2^k57w9t+LQYDwkFwS z+P5D6Az|J5K>c`O5EF$84k(yOe?0_5Ei8k4Rn@yVa>b8*Q?30t@8!QO|EUwG5N4IXN$ zL`MD}0Es|$zsfShcU+&&eNmL&sS?k8E=v|NPk)AHEt`aV;o$)dra!K;+1K#z9-@@| z@&YU_*ZVg{gj^~Lojn(e@X(_$xPDJPvIOInIZU)_KX`A2zMGkcp8orSm-qaoE=i)y z&-R=(|4?rl!aq$e$uFPwy_DA)r=ir%zVKIw(O7=G#eCx>l{HhTVlCh?IHbOgQtXc6 zCAGO}FHB2~zcZ(>q!a~TOMdBdr^y$*y!oE_+i9KcWk7EH$j6iteHoMX>hR&dL=)w8 z(X}Y+0LEY$^Rrz#GM6{vyj@1bY&`P*49d31G0Lvt?GxDp)F1g(L7gF-3knA0!-;az zI>7_GsOM(%!Kctlol4~b002M$Nklgn990KDaiPxZ8ysoNBK#BAx?b8g9GowrLFVUOe@y zvF@VqP;g8FqyzF<%r9kqoAZM#J_fHIi~L0d#V?dQ7hw`i$WvjRh52A?VxV`x3@t{$ z*=L_!1;hOYX1fX{!dFz>2EyyojtEi-X-uUZaWz`n@v{v#3cZ9d@sqSWU%UsvC^+Gn z$c8Jaw~V&-u-@H~64%kMRQmN-@&~}wElPk8^5@i3g!gwIo_!2QrMb_6+?Tb>&Gc&~ zM#DC5<-z?!lGeuc<;BCyPFE-%nkck&Knu+dDb(tQNmV}>8WeCp|A+m#E`Pua(Dyj- zk`DoOiWjsMqwIZ@>=wNA^D%;=QRHsMFMy-$NS7}+&ES=;65i((UT`6-KV@PU!7CSV z424hh(8;r7mM>?GB#(r6YZ?ERF%%_2Ir&b3d_C_<$`bI1RDpoU_HG~bW1W3nePiQX zXm-%px9V!UmsXwoy(i-$?tHD*bP}1i0Ull@D)cIS+Cm>Lq%RHdLJLk(8P8wmV>-L= zRK~)Sf$SqNh<8g~`NEcbbACBStQN|xA2)8??I^9=s51uvE&CQE#A%=(;{DbG^AK$F zi2#_Sel2yx!*T59K6%H+VYgS;Pa(g|fp!J4R-gAVddI$>Z2i;AA4yN%xF9|ufC$9| zaQK0_*pIyqfy^h_Xu1&|{t7`}3ob1*=m@X2<}V+9x`MjyqWxhUWdok@i0sCfNQQh- zP?j4c!lM@)ec`X)@7x?z>vUAjZm?{pND?DqgQ7p-F))yGCLoj z_!g&O2mE*ec$kR{we;1y9$)aHFW!9bU0h@XAGI_7kvw{Mq)j1@$NCrM$2w>+hB5h$ z`RLP_Xbt(&hL)E({26T(($>w~+XpZ2?MU{>Gs-N**tm}}m%%I9$N)X_UO{$>t}(;g zWhitfA^A7qZy6i;Bc5Q6ZH2lfe^!_kTv1`3~D{0?AE({y{l7DqJa!RC`=H|0K{^%pxpK&yzAvd zBxLrUSSrjE0)vOqMgq@7A;_22>exBivgyvd0nYtxLqUNAQ!igpRb!ZVQPgkdx*CCO z0#~y{3|h5u&?R9bl~>gwMOjOj)@y=za6woEqx2%AZWvEKooME~ihkFVztJoILG^lH zNE>HP`|6}q8yaU_xNrYgKbS3V@m!)NZA}{Qq6eLua?_uy%- zMac2xw0a4>c_XUv7xhO`Cibb_J5Cy6ZTv&l?vf8GY!2yrF>p{B@AB=PPlSgq%gF>MU8Nt9M_fVi z(EUo4*{Nsq;ft>Z6<2;%6BzsskrnycVI-Br(x*!1a7_nuxJ|s;nZGK$BJ)<3;Mz>^ zj19Vpm!^$lyZrTk#k)esHP$b>rnqwQlm_!Vlo4aL!+F`d(eZeWkLIU;UgK~LJ$Y~W zNBld{6y7$eX6Zw|*w)@yNHy)^)ehgcG_A=7xglS7Yt84)89lrOF9o42Ega+xgJ_=l zGA247+h}e|r=UCok*N}TcVf87#$Ap6TAo9W%ndz!9ty9>{t#?SH3;6W0o_WX3Js!^ zx$l`n&?E$CR}WFn(b1guSEqQ*TiHw0(Kt%K{NZ8AFUearXl>|rW~ZE*ZqQHtdsY2{ zKUR5`zV3@H(w3iX=%fu%Byyw@zxvbCX!|D~I!XQh_Cu;%nH?Qz$xGk(PGYopXR>D@ zRPOtm#>gQ2B>DX*qt&a?xne-ZB~5u5Wr+q= z*7ExSKDDjY<8@RT^U~j1pP4M{d=ep%w@$RV<#U}HUR~j3FI?I^ZB@U@pI*$Ko)$lo z0@nlK?H26(fl`~7{y}+8>Yj5#179TjP(YNMPxHMMUOtuS9Hm2ZNIT86^?6JVt>uW^ z@tgns#loxaM~uFL(_xIIx;H2FHsomSV=)n5P}NvK44os2FZFj@QcQUnua)JbZAYLy zO|2qOT9kUXwbEBnn-o}?k`iLh&se-DBT+2CJAfFV%gj@elQF{1r$a{t2mXtCWW(cO zDM-p6$pr7Ee?#Br(a3Fpc#~c3J7qnII{&aQCv| z^V25m&PmxsyybD4&j9@KY4Nq-E1w*U0tz*nhPJoUr!{JN7$*Pw9ga??L9&Pm;#d>|^6N&VgG zLCws~4HRQ(Q&!4aHc&iB{k_Ul-`p=QxhX$=o0l>_tjJ93@!6Y|e7X&#{=|W>;n_Uz zO`f_^mYa4b{ja(x%%jXlfM2)s=SxH@_UESk8>7MWaZ>EOIKBP`+7ZK1_EYpW0|%7) zQV&x=o!c*YU`1ZqcP0$WKg31i3+T=PWRF94$>JXF(!tG12<$loVa4TPo{)p=R_;xL z;9zWz%`0VXzm(w!v!ZWP;(wwGHv#cLcQcSuk(>H3yMHUr4+(yq`cD9k`dEsP<-N`? zi*iy6SmJpSoQ~KM&&1<(0T@j)w`QfR$8eDFdnO=?<7f(VWnpSuKI6Y*a%$WU;3DhB z-Kxx~&y$F_ogzwod~D>`+&CZT4T4Hvl9TqJ8D)-V{%>#+zU+2oPMum(e@;snQkj?b zLv3DK<#>cPp+{MYkZ4$+V%Mnjzjf5V8W)#boRjvt6=U!7_T9vo*|<$t(n(P`eIa;=aF|J7oRjhx>w9%CBt(5nT^9nfOZ-SF7}gWh?w0o6 zPmY~S{OD@h5--1Uv(5;?1^&OPnA&kqW&rgAh|BDL$ zfQP36vR2>S2Gl|AwsWB`%1L`b)_31ajG03onOmY{kJR|Cbar^KXJ=cav+axFP8H24+p7}|^rha;X08?#a_smn{>ygxU!{FQ{5$$0FS z(5ggkLV%;e4@bPyeGME$0mH zBlZ6gP-dmY=bRiI^g)Bm)$h)->WQ-&n?B|7c0k^5K9a9OC`%d3fq}-4YMsvbyUS}P z&TedywbflfBhcY{_&je(d@fS{xa2Ng(~|#C{-m>4{+bIacf`eoJs%bL=O|Tw=Rd0J z=l{O47Cr0v;-Gv4q$hYuDa=Z}I@zecxzKDayuG~ggJQeud)lr5gikufL3YjZf9coL z|8w|U{)B1MCeNpwuSx%1YFy4KAwlo)$17R)mREl>wV`POg$n=~gCjZqx{16+F;)rr zXP{oa>`xVSGx>1Qe`s?(U;^wwr-}EWqj{}Kz62N#4gSqv(iV1F=s*UMSw>z1x+&G5 z|Hte`%a&Wqs^5bb#h?-T`_%q{st)_tgUkBNlnaU2JQ=7c112??SG-VV`e>WYwustm z0GW>t;E0Y1_4jzX;)*K{|kB?iJosz#yoIVTGEg~f%@OEM{L~u zCd-yrY8t+n+t@UdXT^YDaYRPqE!8f=m;H zy@Kg^*F1zjBa?vt@8=FL_3Ejj<>rjaC-f=`wU{EmwE|x6Gef!j@ zQ$O;Yw*8~t%aWK^R`lpP5Z356R7|xW>#GGrktub(9QWrp9HD4h(!K z$)Nug-)Q$9|0)Xhq%uOI^Z9oGQNhV6GCHt6&7(*tg62~R8=ykp~L=GQ}^+Di+w)N_X8cydHnG7(WA+cQn>GhU(8J-1_c_{O-YR# zzcMp<$^%hhgd}A{-j0vY+m)5_>MIG6 zyYNWwf3~`Q=HT6>ccIMR;<*S*nMmy_51t)~EBOv{0NeAEN|0gm(WoK;YqJBwdmE@#Oy*wm% z%~qRj)HTHw&oTb@d5wQhDs#cmm0wsqb3#SKz(_^?^zZS}*ARM~{6c*68_{~b%;zK^ z9FRHP#xjWac)N%4rNmJ3wN3_Z1YHvr7QZbk^%34;*pg&W-~7D3v25V3(qE&@$Mbv* zP!Aj}Wlqx`-m{%nRJt&E=e|ontT!E(sMk+^IyUlhHqm|eWpdoaOT&WiAYVQZ0|-w@ z-;UYD$82PIt67;#H@wI5nC+G~;xbDOkZoZZi$zT|Z4l0U6)T=Lhd`VXp{&J`db zp;Pg=j@BequDI-q1#U%m1_WwA6km*o{!>p9r@1Zl(l}k{E8!`(#p~5a`EID;Z`F0* zy;aljG0(RECZMMkc{6GU9rTZehezKRANK2bz2Sa~+a0*xYTvcVYFjzOWSKj+sc9X# zWlTlsh~jneIaKB3(I?L%{BaUAu4}S1UCwveW$e{4;o-#7Lr&pO+sDP~mD6|)Eq76q zb=%vu4U@iUFi#^-5g<_jtv*hVdNR&PPwYR$Xm}*Spk7<#a8}d*g0)u1FCW)7%-!X1 z>;yx>Sth;f{ITcv4~__##d$o|%;utfMQ8E_EqM+(bn5u1sMrf41J907_2)D8qx3o@ za%zKldbRquBrcw=i2}gpyKiNv>`{6J|!{60x`r!r>g4zB^eDDAlodzG+8&zA(Hig^zm^FN03!i73kyhU{|1t+Nnzzi#rh$uc*Opxp& zvHuKWn$YTTW|uY2b!*oZB4Qp#nSb4bM3ONv{yRA;d0bHNT`<)D6*(LY@76ZVd8NiA z>!e!&QRF>N6WZ)73GRUlQj<=OGN>03dOU-j=Yy-Au7-UMXBpmg72mO~V%@*We#WtZd>+wUDND!R_kW!t^;Hu z^#&sbG}=u1`@_Sdeia*XZkSF#E>5qW60KMJ?RGdSsvWL!jGd}R`rqKzRc_oQIx>)8wG-cB9auZNurJJnw&8uzpg|AoD%|+YqrA1AV9W7(G%}zJp z^ziP~w8Z{|;xCR;m9gyhJ;9}O2kfvrOZdZ=3bWf)-RRO)HSj6iU-FJ0-V_>|b<3vJ zvl;tXK3pG5C^L@n&#|~&&P_J^?#)*FYL;^5624wZ8zK+H=;@8T-%Nrw4~94*Y|}Fm z$Hel-QbZZfwYzlzOD(o-t1Q-qpEWej+-7lXr=*On7(LQI;qhLjEWqcGgi>EkMDyKV zvLty3ex2O#C~)!^KS+wn7!nw8VXQ%aak5@L34^?9iP^SpT7!8y`yzfKj}}rFBeFNn zJx^C<0``U^cof&wr)5?hCkFl$fkRY0Tauj1IGIg;^hi zS!Wz!B6<2xcqe#LR?@gQRev{L*(t2U?fRguVcG|Ejgx4INa_`HjX7Q_HjX~ z67zFndcT6uu%IiqZ(7~pa@RDvU6u6?_x^bn>)KE28rD-*_9BP?m9ZD-wSpAfd`T@l z@k4t238@C-wNa`%Hde3Z62Yn1Y_)A!)nr@rLA`lyiNmpr3N7&*Q(g&x=>}qnVSD7?69{T5PL7uWy>Rps8s& z`858M`Pb`c4^D?9>11z9hVk*Cao2}N-hyJkJwVZ=F0yk%SWYsLq|ag%3*X66z3j5fH&`r956+%F`v zNaJ-h>z6qZa9e0-#NF{>XGJOM1$gkMqU2L|+Z`3V?2f`6cKf;|7W?AQ>Kay)S7d=^ z+zEe(qSxrgY0oEQ{uh&H zPJGnZXa?jBfo}lg@1mn)FAfVhmAx2eHPl?Mo$!NTaFG8JvOL*8DZzsgK*?6>PtKG47tJS`2QbW_yJ$AchWoZgT z7+mU-qhE?%m{q6p>wD6eOk*(p>0x2Pk3|LzN-*e8;dO`8nWQ5KyM}DG*^7QMTh>i7 zneUz1Xjw`VvOXviQ?tN*Z}k|?i7art_}lAaxC@7cIvxMt?K>ZN;MKkV+5Wd;9Fa{j z_iZoK)HJ?OS z4sjYZ$4{fnVf3BadRgkt3f-GjqKupFEUDba@$bMZfN@%C;_<0Q<@_ z|Bt=vfRn1a`t#nKveUNA_9@$U>4*Xj6T?*^lj91>)M==SQy{kW!$p>G37Zi}ZYmGXOI zy?G0Wyo2Z6bsmoqyR4fn9-fX(*lpZs!>(ggXvWCfv1!Nd;TeZZ z#M{B4-fvy5xY5;Bm))XE7=hP@WHJ#Wm$OV9ZD_&|px}semWhFNsFAUvD4Ia^Zf`wa zPpR7Fa2!8qcdh)~WZQhqkqR8g^@evdXh_M!K}TnY zD8O7S?WN0E@i^L$s$|(% zB_mQR7*+|n=rroV>_}Yb%ac2k*7u93V0|dENxsXu~U}P7lw!FkM}4#_RIp z_^rc{s%dVVvM4oy6*IgT0Zj>x5{6+V;BFil35RQ$h?C10UL|E%HH5VantX{^6Qlc0(5w9p( zB#MF+F;X!xAIfn!Leemsz23MHUgxwNiDWFC3HVdI)8gfuYrLLDi`!FT^76GtUR1r? z?kN1wXvs%={vj@*Ut}55`6+K50>=;%h3tl=LWg(GV+}n7nw>I5XqrV7de4TFghTD13WVvjTm*>6UW)GA;xS9d*Zh*(ji`=k6 z954>7Cf;L)!B7TA%7p7?tJ`a|@uH>*x2tBm(_XgT;-YuFDRM~@BM^`*rTcV@q;?cI z6%=|qlzfWwBnE$=s)2Th9s&pqO-CP7w;Tn*(t5mn%!ExJB=354R(!yA+@`be0>+A$O9sK0XxqtGlEd^!e~H62e)SZ-XA60f+$6S8yx>c5h*w ziC)dh2eg-kbR7tUdVJ$HXUv3^#}ZP$ym{NscZCNy`tx%8bGr5iL5>RdgloU*BB$M@ zz^SOvJHuU2yq)D~eFhK8jZc(PsC+2wLT<&oFHbOwhiu55JanQpK4QcGeCK^h`~Gf= zLhexN{oRd7`zM?eqC?PLFP4p53?rr`P+E(Rq<*FVd8v`q0R^zahiLH7^d37PNiW={ zINi|P01TZCCVr%za(LZc5!p)Q2n z^YZeBB>q@wp@{8}#62t%X8=?}n_34zHzHkVp+H2Tcftz39oUiep-w0ijz>c`3LLl4I!>bE*DfRQ!yexv@$4M!CE$uw!bL(GaaB!z7&5qkNA*3gIQ z#zXp29Ff;-HV;W2qmVoF`H;lDm#0-9RzGwN@;)STx0{M6^iE0T`;t|sIU)~xMgf>h zL)O9GXg!`Pr zu0u8C?sN|A_s~y_ePl^1+;gfg>!S!;{5uc_F5;ngGAfbvp-zYs#z#Xn3L+MZ zeI9yDOw5oJh_r?t3D<^kBK1R66msu}W+P2@K!J!t?|?9L+sCX!+sljLyx?+7OpAOpYr4UJvDu_dt>Ryc@ia zJ|sPK`~WcpY=~NQUHXc-?S5G9%3znvlw~kv`a&!QVmJ`Nf%(`h9vF-oMUNBIs&2V zzHtKsvtEx^ikoub0gg1TLK4pXk91BT$WS3~x3RuT98x^Ssk364~lK-i8_vUtQpG zR4i+@RpN($ttd~7Nxvm59O+zuh{6XkI!@Nw&FcOTLgynfLoquJs zj83+ilYgU6%yEkt4|YYk@IhZUj5QbjxxKvCeUuZ8<~6iI<7aH=SDVodU+2_NpI)Og((jyprlFr!o)ldWdh zG&Rd;qd7KS4#jN;)0w@z)y#V>RxfV`H-X=Hr-v6gaSlf0T`a?TWxOXUk@2MEO2tYR z%qxMyhXJ5cu&heSs8zBQMrMVgZ}51GQ1o^6UTa_mE(R#!!cjwd-VI>^MQwF&8Q zBGE7z%Nk@NMyudN$&iDIa+Za{X5t_tqobg(Weg+pFuVuC5DJ*bf{@paMIiuhgTQja z>~?#29)Ad2A|EMk8ShrgydFn1$7!MDIgVk)aEdtm1O~@4JVdZqjNe}3Byf~uj3`RR zuyQGmQD{pF01NPF!wE%iHG6oIndgmWkGB!BxehYA*68(C*Lpl<+ii~gugvx$;3yaX zBtuET(@_Ay2*9nOnFgyg5fr%OjTBA#7^!4Bl}Iw;wyO1GzM zugkf)%!DuO}5s6F~Zh;{LE0B(qT922HJ8R9VMD0hv+qUa{+!q879jSdL z8%D%!8cjlO6q6gra>GdG+3YI$! z3OYx{vS}23jN#ZMI5RQLP?nH|MvKSWWadSUMvu3?-0LZ5_VAkfL zqN3u`cO@NiB zKJ0Rr6}a5_#cucNZ5I2skIlBd$lC-Ug()znFu>go+pr?mEf&j&LCk=Y(sA7RV?zV% z1JPl?N&s2N#IQa~`M=3=hT#(FS&3qHVy;9n@z*ixoB!+edJZ~V#bCmntIf8xOD(ov zkiQ;)=zS|Q;&iAainzC#_(KKpRy-97g}>lyy??5oMAp!|HNqtKd@xU`RNWD$I77~I z6IBc|I+kN|HBjDBETgJ)yBiT1tZMXlD%HH`#>PxluzAsN zo|G(`n;~U0#xRnL=BeekJ)aa4SMBy1E8L!{Dz~Sw+~YZNz~SEgN@Md5)Kv!%6usa? z5$>m48t4k06r*gFF6p#%33p9`n41ko*6nw?N;g|wd$&3qPrub@{t+Wpg?!}k`iHf9 zJYaAgd4!F+BW#6>1+)j-80l+sYztJX*Ns+J@%~VEBy*WlXug2}MY_&W0 zud&)zz13t{i+tq(8-Vbk2{;r|cW8Xd(Lq>4ce~v~5`PRRlt(1w?#I}~2P7vXX^?xb z=@Z6kIPrPW40Coo$BvHUxYPR5nJC88WA>%K3H|F(=Dpg~)bwhTs04Y}0R+d%cf3-eP~IG?8XYTU&(Mp- zV@Js(Q?FIC^Pf+QRTa2g)rBx}@|~XD8?3gU7n^N+P#zAwPstO_1iImLaHoN&(1|;w zpQgrVjh9RBNaDoTV5F5>ZT4dyH(S4Ywb{6=(JeZTJhT~27>qWGG<-u67VnWJ6Iq7@ zqDv}je#T)7Kr#-y=U>lAI)7Z0^qN`9s7L=VA?{D#TkLxmnXI3$He0_(o@xLocPc9| zJWdB~qOqk3_`f5(bFbS=`yU7d!9&MWHMQbjQc@yGP1TC3s;cNM3fd{`kN>GK-tEVb z#$6bD*5mPrIhOMo?E!E<74dIR54!d#@JZ1k`E#+!lVe%-5)H>qNr3l_(6Xh_?JC{n zbRRlkcmL~SlVxL(%TGZ0OBd4 zEBCj==%jPxipg3|eC{ZfWa{m)$~)eM4RRFA4Er3;-9Osw-@k9Pl1!#>JvmV%Ye}yR zN*Oee6go2=uReT~rM)JGW$uh+*fASzj-xM_Op9JKn!f^pivh&Qf+ybV6P}nApQr2% zX7x?L-N5IpqMBvEiNf{LAJdc1Ix|YTV2)b;_d;h(?Q*kic zj7Ag7r>qym$>YXJ<=R+Qq?0q8R?dl1Ft1b}Ivv`$#=7Z$*2I_#T+Z^vCR;fMnZkF% z#G=VX6S&vM8*PL;5%2f}Hja{~AzZYaRIg%qodVvLr>@-aE)@E8)us1bofKDC?Q~Zj zaC*vDTCIX1Cm5^(4Z_{O-mZ^~7vK0_f^hK+xmX*|NpwoFNULDjlwDQjlMW;%>t0RL z+=EbYb*bA`vEJ@3JK}H%ye{wnjsIZc`_AYp@Pu@oK4oIOgt-h#{QP8&8(HOc8}~ch z`Cpsu-+XPdeuoI;VN^uReZu(Dkz~ifnG5vNDdL#u(?Cc>7vdEHl9i%A)HXMZM9l>_ z{RBXBQT&NEF*`@h%{WgUb>X~d<#R75X~YK{uA+T**N(5Pw$-c5zGYB~c#ys!9weF% ziZl=uI&*hSOzcDPio24<;(M#z9_L3!>!yD-H2<~4A= zZmy}t)j#04;U={@=COF?uWpG|Ex0RA{n=+G%hta(7~d&zdN$)ZF&cU8169D05|3J( z5+Xv3R{^i-$LQ8Ie84>xn(vWgtfGa)6Pz(({%`Eq*7IdLM<#R!#7 zNfvX%T@ZcEUfyQmfxnk;uIEqe%{WKQU6!I!DCF2}3>ql$mW3C4EJ_bKTzfY;9P3_h zG;csp$onAt2}ocK)I>^L_Htshev(2l18|Sy7TpE>cBZcuS1(oiew#X^Y*lcZJ2e;?rj9I^+=yY$`vH=U&ejKY(DU ziCKtE4!3C(k0x;9yANZX&>V(yO+jAt)3*>*lw*Z6jc%R@{?8$C$4_ZxlCwtteW)F%%gBNIQM;n>Sv zyofvCaF!f&x_7O!*uVe8WZ8nuWQ>rtOB0NMzkJT+Yurxv2P;>v{0P@9JbCraYV~=s z9CuLy$DIxDCGCjQRsLDC_4{WUj2|Emy$VQgDUgvjP;f_Ad~->*Gc$Q+Dl54kG&s8k zJ91(9=OeVYZE>@0%@&7)_EQjF`)H7tm!}#za#UGqX-UqG9XlxGN6L_SJvmN4J}L^z zP&7S><0j(!2+GZfR=v?={_+d6bvg2s0E8u{fkFfBnIvVxwW^rAu~BP2HfkjwcDTw9 z;q8uXcE^uzG?><*!xiW^8Dze(zvPlju9Qfm_bgksbSm!oaEH>9ysl52kRTS%0u84C z{}JT5uC&;;K3muPUYW%vH-DLcc}<5&&vI6o4koN$H9!=KeHy?%Z4Pz@NrGV+Qw>4`?)oeHp30 zZ_Lpjt;x~X{wFzZxt`;$!ZSTU-mV-j`#dqfNla87&D7q5KIT{F=xSa`j{Ev_x%67} zBohE9U8Dri8aXMg)--3%95wLg=gpg!f}8&MQy$7I1E}6hiW{4ssr{D~W4}K`oByar z{Tl9{3n2RT_xQ8l8j?qsWb59wWBg%&9{6pn`gsicB=imXOcV{EaiVBo8yqq2*Ur6S zF6~05`~J`9obt=DwyfEbmU4Avj{Zl;3-c0P;->TEvftrZ9)NhO4NY;~---GzTdqww z<9L?tHFKV!zBpS~{&q_I^4W?g;&bY^2A}{Cj)OWuMt*w56<7WlNcfN6pvI{M7bzx} z`X_zrtYev}?^!VSj%R60UrEw@nJeY4M4mJN@!x`|#&49l2)|l<-+HrYO_H8#WGJIjOZvA_s@x4N)hdgnj6Irnx zdQcDq(;)-M+azI6X`91gpRsDyDhjQ(Pb9RZJJOOb)Ji1}#j?!!{~`?iKyBlHabIY! z!?xO27RGB1hUu?UIQIDhr`w3J`2HUa#t*^7G# zUAI5w=EugW|D=)6Pvpe+VEh#i*ETHq=*0LRMrLZSPsjiBl$3;ND#p@Fno?ID8c9dkiiaC#21f;R8`qmn>OQ8NOBqL`}qd;LCpKB9-ghsp`T_G>8Pprl95U%i; zo<#e`e<#I#gR#6EZ6^arId|J*g5h)#1cM#0bN1}n~ zM@gSVp%DP`c<6awBxa2vLEDh4Us0c9sJtmgMIQ6n01|HGiFd0X!29pyq0ha1?kgzM z-9&Xq<(wR4LJNK>wUSALc* z|9nLhyiCz(012&-+9bm%6ocs=gf(FxJ_7@>`T4}SIceoH!3$Vjr*&VPMpBq4 zz?Em~AF=1AHR2u1cTwlL09q;tyHGFAP95)r0DUb*vkC(^7j4j3_NVv3?9NO%6Kksl zi**U#qc7J2NSKBlchpIVsm;;dN0vFf@;7lk2|#PaeWgUu)JcgeJ`t^Hx-GhO{CmY% z-j$IN3tIoOH9h5*G>HT@l_&$ypNflFnUR>%lw(+ZJX3oJoADk(e++=$lrKyUa0boq z1ug0~r6=#XT%~vdZIUrPp!NWvKate?6kuS@%MYY$uQy_!Phpm}@cL-wKhZ21*JSAS zCNK6rc781|)!Dk65Eg8DFfRII+`j-o!mqc4tzXka?vyFY(#@t2{6CUnmjZk8R>Ml` zf=vCHq|9N3evZ0lhP!^$7joK(@HafQBVX$h*P)Ud0AwMDo6nfqY{Nr{G*wTQ%U(qN zB*00T4TOa8*I(j92>#Ak^?T?LdCg%}>U-1D;;eaTyVe)C(;6V zL(O@H&x^9OhZ0!!VchL4rOq7ANS)Q3t3M3EUG(c{<;!SmB7hWme;T%EK9c&G0?he{ zjuvL=?t?6<-)KnQJy9+r12YfMt5MUwz?-Sb*4+#Xwr-9}{vR|*)=F3fOkW@|$l72I zXX?iy{8#Z(QruVQ`=tOipvQ`>Dp!9NltumH2{E6cK3W^>l?VXp4LR-0OiIR@?xAn= ziR)3xjQ|p|J;oh%P-3uN`v{gAs?V0oUcmKefRr8#pv07CYG;sA|4pp=1N7@W011*F zr&7IM10l6{ts&_rRCW^}0T3?Q_PBpk!9plhgg!qh$K7osYXM`7c~(7G04 zsp@RQ733|>KB3IVqnfY?mJqu$q>3HONf`xCy5`9f%9n%=t#5~%is6~Lhox2iK@kNM4WfHvVE3n|OoLNfw%(AuJ&9%SLQ@nu8eEZ_ znjG!vu3>2n*Qu3nqw}=$H=@izguYBAS*a5+2KCpgeLH~h#zn{qhyg=>@^f19_o!n& zAe>$=stbRr$TAS_4P#`Imr(mKK#vsK@vN*ES6*8AJ#p&yQCHZ!-tc4ozZ$WY_hf07 zZV&F<2k4Ok#-_{LvGJ||Uvm2s>Y|JpEj%BjH3HWL*YbM=*U3 zS6;l*_Sd3p?M~EpFQ6yu=?w6HZ(DlGden0(V89zR=p+3)g&6a2=YLZ)U*eLK5G{8F zoyu}_dPHaHu<7d!6rKPW6yfE%Y~2Nj)YPPj#s7ysX97auTc#?X~aKm9o~CnraS^FSd@>g#EM1!(&jz)OJp@G+5z=bwLmMGEb7PrBmug@ z9a(%vL@>AnORo-b7ie*FZ1nx)S&o)T{)ztN0D|Qo5%yy&U#?4BiL&(efEq9n<32+w zl@9NOAA=poU~wlweuaQ%2gj?AX6ruRm7e+&^4`(XcO1H(8gdN3p*=ve6!KS4>I{HC z57Cm2MWfM7TCiXN^=F`@K>ecrSpfSnW-$vFE)2Kw3m5JrM@Vn{0%!nGpO52}xY%}m z{yXmT{vead?gDPKycS3n;daoeH`-uoa`nH5gHSg^A^$geG!8J3c&9CqYBRONV9hre z#Ny}iBpWbL8K-T>2lmx&bdSIA!V90n`=0cUZ7>YGLWv)9Hw{m>%+bVsE|Eyc!|F(x zo#XE< zlQctk9^hD^R4T8-JIn2j2bvTC+o1awDWiCJ)_hD%%v*ZBUWa=@Cn&U)|4okn2nA^) z7zy_7;GThe9rddtT!N)nr?|JY@6I2Y{mlwP@-ke{0|e!zSLdZ=(R^03>~knf1|bPr zA6^ik|Dkt}11R+jAy0r~xNs*&p(FaX-Zv-|Z@Gu3nX+Y)e<6P+pxg4OHd{B1-spfg zMPXC`~TV8K69YNkbfQ10Ep2u)dj;75C*8B`dgGwFX57t9`5p%<8AgjsvK)8WC=Zp zT{af=?2jgH1t(`9h5QnBcacSDt`sKskVJ8OwkUCaY*kKB#`}wS`*RYY_~!Mw?Cid} z^Q_=_c^5r-W}ln%TI5G7*YL166rH%8`MA83;RF2#VbD9lug6sDE9}kjnh!-O=K;OrDXBf+`7G&Dp_u`yZih(RuWH!#`a{e#rU_8~* z&K4j10i(6G6$%-JtHbBR<7tv}tAkLc8}q@`fTelIFsU{C?`W>N`KPvW$Np(KuFCO1 z>W11eY?w9Cf$FMt-}J>v|NS#TR|ANI>iI^I0W$&&LQTwJaf&>LA@8`PJTQvh`(PcxSOs zB|3u0MS*%KlX-)yCuN*3sK5mR4O?3+;&WbLi5Apc5Mdw3efm4)X!XO z{yK3X`p%8;+s+=|d57$=1i(W5=-2x|05xzKUsWZB^u%|+w1qjClE8uWtQ_b(qIOzk z_!%i#8O|4P3PKn6MAl;n0|Qe=u#eOfJzDz29OO?4)U{56y3~b#2J0BpzYwv_OA`K- zubX#;1VXr3quEz**D+n~6-JEZAX1iC2#3D@6pHjwbp9UB=l%&%fa z<<2gmvr~#(%lT#CYE$Q__Y8a<=G*C-%XtwH;i*VmI9ig5~+ zVgWa?u32+8hWOF{TNhmILT^O9+P;s|1zR{7C<%@VKrTdwL8NDrO4@sdJb&QfPX+#? zss-dtkj}gkgPTEM^l(AnwadSB^<-xZBR!{SxD`0Bo4=#H;7AjQ=(_GIy{1r}z(LR@ zXq89E^gGi6Kh_5;zlu)rML8zsPnLf!UG#3`0w{af{rnu^o_J*zmiqmWK*pJ=a)X5h z82rwGw|OH{w97kLC87SPL(!oQ@9a6VS+C$9ulz%txJUl`HA;i{S$s(9!SA+UmsxD) z2_17&oDiSrLo7vs~zt3SS+@OyMvKeAnWEV>8p3RNT05aVy8i-8_LJM$Dw*_ zQX-v^Z-eF;3q*OyJi7|iwEEPrIMBXXJ@CUm!H$VpN>%I7amN0Xiq`tR(PyR*U~}g z2hebMvp#vcZ~K3CLu(8!l-hLjD`6YN3GJwjOMSaVze;9cD6&-DT9NaL7F) zhFCPy71iHJf$x$Ib^JZvXh#e}AH1vkD?g%YPppIYcOOj*mlxk`nCWK+WsJ>t5t}8JyGI72IXOuG}U(NuP9FOyFuJlA>&4-EtzSv&iY;?IpkK{(?au)Rl{^-56keBEWz@|%ip zw%!EPB&^1Mic;9p>K6C}*i06UEIDvP8NS!sy*y0MTfN)+jWF;rs>-P7{}!R`H)EA9nErONe3O`X zvB2?y@7}%vg4-KY~apVC`64IJ>acI&C zM(1{f?cN!^vY+K_(4$&^Nm782xq8Ss`jwvGK|Z+Hag>pgEktrSrx;Pe+|-VA;B(OG z<%zSG&<&h$IxN-zlHkkS5t-cBj!-2VyjNmK@67EY1<_Vk4HlNj#DpfrT6V!u%O5?Q z_8K`5d^LQzUGtaZuL-pW{*wD3lTUpkq*=W6hil7{@8TCHAPr6Kyngc1(l0Q>koUFz zX?RDUG_Y8O&r~2LWYgL`)kfcN1^B3lz3oV~&s)ZQS0B7=GF-g@xAQ)ZfE%TvMD`#m|&exZ`(lL=b@2^XHbZK zN-{JUGZjc}$`ll1^!D}1FyI1#pic*S--tv29^ZwaWP5o@wS8_RB8AY@-%!qpz~4SN z>=sG=?WVFfOgN@J^;|+F&*Ru8muSvI2P2Xsuj3%vQ$O}^6kA(>?8>aq4~;whp%uM> zE;X@WeO?TQhmPu~rJ)m=wAgk)^BR^qO~=h{Ri_vqY`wT}6k|`w_$hRHPj26D0zz$E zf8uO6)ppqzjAQMDt-vSR;Gyv4-vFyJ5XN|THc=PL9d=!iE;j~7#w(D0Mr#^0wo7#j z842_&`}-e=g4wcrRK1if@-0;Ztx$J_@*blk?=Z;aB1pdkfuolc*!ZD9tdP8|CqRC% z%HZIj0zCyPQnDeDYUhhy{cTo zyUwiRf|sQ1GIl>w?mH zAU6G%gFoSqd6iCm{Y~F-jfF~ofITQ5Yf|4yw#Bm7|7uW(eBA`+^RJmH;JO6(hxXgG zpjgKXJ^hyGZP=j;edUr9l7`A;l(M%slQbhsVjHQNBBmnEaiqDOb*tBs8qz*(8 z+8Y(kQ`QYYIUc!OBe5O4q2AsC=Hg2%N1Eoi7vmk_`H}Hk=2ElFfU8416YyQQemivf zS*!aBS0V{+vzb4Pl5jwH@PkNjAlj@SZa4Gol?`q;+t80k97*l9ii4lj_5xmaU{GAk z>D09@#nbgp#4nV1U|g~5AD;`1F_dObza>-q67Knvf2!j6{Uro0ZBl+5d5EyKsEpv5 zuc)r4csP;y6B82#_=x^c7E-frVqVH^>T)6}hrU4WptWnn1`P=4#F|+P*WH9y1)c2D zidJ#=_c=j3hF}LR&|n3}3$W|+Jv)}1fOSu_W#v#LqAo-k7Brdft#1(VfAi$W>w-sw zHwGRto&huC=D_Wa2zDpZb{<~H&_Ni34mgE;o|DWz{CX63oA1)!Kk~?pzo_r~+%NHWh0p9<&lPvIj zLm}@p)P_^&uAs265V?gf+(%Ff0Cq{Fbm*uQes^9!y$KMlM`>Xrv90jAugUkuL5Xt_tqa|cd@w=N0AT|uFo>y<~hVD{!m3Ab9g6|m`-PNX{#O^o`VECF1+J|334 zYM8JMnJE|CsQ(aj+%u<%;VEOutIPB@*yoE8z1!BhNXI)RkAUIAnfZ|vK%#ZRt>TAp zUi4%f(VoLH4zk|LQCm&7;B;}Qk}5E`xL<-!TH0%-2_+S=pA7C&tD8g^AXS4*5(*V#ICEv{bYOyo_1_T7ai!pCP27X0#y~egytKD1UjGg$6bFGI3O8V&d z_8KjsDxS zvmI>In`z`b{mhHCpB9-e20N{B6+#qPgY3Gw!JMuaC){KOojz^{kaH>Sa<8LpSTdjL zC=YOW{#lBE5$$VSbBr7#i?6jq=?RC5Jy;j(O?a3$G}$%TZFma8dTJ*r-e7c1Zs7^T)j4*)CDjS4eE zFnUtvQfc5&xC_fF&Q&&Hi0YhGhn4kDXzo2mzW6`W#N%vL>BnVDw}Qc@URxzp`?gtstaxs$M%V zQIDYnFtd#!eI-TvyW?^mf>0}Ff)^8?F<|y}Mjyb3l!4tUz@L+-9FFuGqQ=?f&BVhG zghSjZ6s$9-FJMwT<@ShdlJXTG{F+s|#No2Z>u_QW+TnaPK2 zN%KELp_U@DDO|WIh1cuxCi?Vh-0+b=6p8v4aRWBgr|oaYL4#fI4!TZlt{;8+7u); zDhg(H6X?hY{)c^>!R>h1t&|FZEJdO$^kuL!r&#s?WGOMP!~BBr;lNw`}nTs6AKjn|U3W?WM1WQ^h1$dZ!R z>O7ZqA>po@A~2A>+K$jeEYpZ$XcBb(4++Pv&(74%K736+#G2>2gvq0)VfqmL4_^ls zN*?^RE+)Ed^O2ft@B$>x3aOh3=bq3^#TcJigb+ppHL%y(?RRQ}SL(A( zfz386COI>YxNhE=m^PRzQTRM!cVliFq@6g<|IT6MpaDmb9pFF^(>ZS0Zc|99zz{zw z(bEsaAxIDjt#c7JzY-yUsvXx3Fpeved;qHPGC; zL7yS^jl)OAi*FuvCC3lkofS+`7ehNXGBlI0X#79*yOOiNafzA417(cX^rn13dgyM`JZwHBJX_|K9EnE{QyGW<0&_}X0T6&1YnqeHM z6BH<8r6i#uz1bPZ7Yk?~$QD~ZfdS1uZm%#3a5vjLGpD9vI9?J-zC{Kp2(1(Gkxu=;T0<8#+#{;MI6|87GXM_uJ!7$arUafvOu#78_P;Rp z3o$;jUkkzDk5va`u%XJJtHG%cAcdkfg%uc;> z?W%Hn4}SSMGr0l8;T*vZ&s#GIr}wwII$G%AN4ASnS^vvB(`9uq$sETEv^4ojR!clIsGz^@1n#6Uu4qxBDS zb&Xes_ImuiZlX69pAh23?`dL@go9&X0M~Nb7Kh50ERGN=F<_7a-9yBg7Q@ zXGinqAS+Z2^ARt-WY6U#S3Ff2H6JMf2}^6G;ONn4)#R1sXSK zSJ1N^q|OspOi_Eb`p_EOr@1%fK1$4#XuFA=Q@f0sM`st`M!KfRA2BFcPUwZR6 z$zSO2WY@KEldfWf9tzV^kS>}MkgP}E2rnO^nYamPK+(*XD1iieOcEC1r=shH(PQc! zZUOAQ|K}kvoS*&_Y*6BC0RtP=t|YmyL3FQ65>;=DOJpB2DvH0YpV_H+ zu&}5*Us^7p${?DigK37{iQGsMv=bkY1gs5 zac?df2<3#3L{aFev@n3>K?~n2A|rs4^4GWfB;I!yWt2oQT?LI&iscx8q@6JKh;3=H zAq3W^;6XQ6JZj85a0@bZTs5{6JsDZR*lo$22R)a3cMR^p9v=?^P9tWbl5f$xcZ$db zD|JbuP5S%9s3ZbAm2P~3g?)R?gI@pKuZ{$)r9bEf*<9;!mLaAUJAFj;%*u=BZ^=gB zW?y#34L2l{+N1yS`0SU#7X|70?KGE>>%uZyhA+tH+VzlpDC{@-H!|m^H06)7J8!>m zowsub8yGi{bk3a)eBfX!7>Yj_6Vqu;6|Ipuzlb|*wK*gOSz!8IW%S3DSOgL?bC}BW zG|}$aY!XCf%#8!wRpN9DpWKrM2kP?Pr_K44;Aj{nA2Rb@m3nPJ9aJQ5@`*X=Q9OqX zojvqG3I8I}Pw(H>N`x{zJ*faJj^4^(z9CtbO+|g71VS$9)L9b;oV~0sxz2bFXngSJ zEJA$Gq`v%_Y#pCLit^GmebbrMaT7m+fYePq%;eZq$E zvTpE88uKK7S*|@atjEvH3!$mePek6-B@WDwXlaswXy{_h7=1(W^bJ_i1<1eBLe?5M z&Q!CU&{e37gX%W86Q07myg=7&hhxUvyne;_3;^RV3*NH`M)kAmA=^F146^=#iy(yveAAX3z#5s+MwCiaR*F$tKM=BuDdRS&g z{=|8o3c}Pa&$E(555CqRb;=`8U&r8^pv?Rlozsf$9Rk9LPw1J^(^yFM|E&8%W}fsihA?8N63ipeAQ8Ps3xoG zwB75lY*kq z+A_GG5YBCEmoPR zf8OL536)Q9E3)1Ev*3LN%rm*eDr%^m3ZlO>Dz!uR$4f8DTdovkune{gij_j|7S24gj2UzE-u(lm0Z$Bz@A zOVwTsI=cotWIhtp`}7tuX3-YeoKt1;`|l zDV0SA#_{cx7_|cI%jNIR=*cG983|@87i&ZN?V;^*?i$< z`1-VhqO}{m>*6)TWF9Y;NAaY2P`4;)%$R)?`2myPxbv1wI=t5!J0e<%wHW7IkKnGS zV?O|hvpLRjoME4BE&)&k$ocnjNrz?`^W+9&zD>L_dv&sb0_@%8nB6sxpDf;Ue+*?U zmjHs6rjFywVOxS7Dle;8@Vb#ZQA+U)Wf{P8^4$aZkQBftSduz#n@Tv_P8e3dBf>*AXe z&mS}SH@(N0?$*#bnJ9z|2NY7Qoig4&faP0Bdy36}c4bMsYjr&Oy#6+eUW)iCNUFa{ z&%DxaABgEZU1ZaEGKH4hkSjv>`C{7_1a;9$wWNs1zXZ(RnNR?^7fF4C-!4 zU(K^Tv{f92^`3z>q&y{P|C)FX_Z|M3vl^3USnOlSeUh49k$0+mXj73MicNjynDxtB ze1ZMP%b|J;p|vsl0&f{E4KGM1*Vj44Z z*M~swUhEdh(gg!96S)Qws?3{Akuh^0y1MqZ?3I(z6#%O$Qz?u7)GpVdZS)8m0*o4gWD|!rUXo5i_!L zqT_bEYDY3NUNCVt}=n&k@LzPWTCq|1$@ygLkffZ1yqFU z747mybBaaX#Av(VFL(hcjHXcq7K}G6j`DlOB)uHy-kdVWs%tR{mu;-iu7hqij5f17 z+}uqIW->D}4l_KNqQrN=dOc%xLrOndhs>q}HgTX&&7y$+T(NN8&4uWzA<5lVEykT_fMGXWXLKshp!GZUIIo$ zJIC-KPd0b?GiGmONd<6(H|%bem$}z7RDM)Ps)X2NY9j}@VwUDxQnB}fb~uONlssXG^LUd zC&-~rC0Mg@Jokfe!A^V^r4CS`PK~txxob#-pN6Zf)CH>xP8#V90)!E1cUBRi9%`nR zL&Gln^|BpGBvX@<5$!=JfkOs4^Ay#mlqUApo7ODy?+bQ}5do985@VFuY6R~Cb3g|H zDSr_bwh3XOcMlA%Vmo~z(4Pe>58Zj(M(MS&XxV?-)epsN7^dP^55+Od@iLL$GA4Am zxtVGRkF?pWQNhEH+bI~+x&*2ovK2^^dPCI}-1G8msE%roPi9~(IGY;jRwiV-^I5RC zq_1G-Yy)<~Kll*aYWVmcc72rP&9-660*JvrxYr-sbFz&51Q#k!6m3O8J-h-Y1FWwQ z41?^;TB`71dzcNJL=)Na)ki>W*w8)MEarO)Io55c?N&tHP*O#Wps@a7CKZ|9Yt~vC z$w0DBuyH*Cm5?{1T|%*qEkB}|hURnO`q&;c2;fKb$ZyC^nmoRYj)pVK^&C>Gg^6Kr z)Er?P$JQ5w$tJCX2w!qbqi#oLq&{dI2%ZsTq$0nT{!BxWo+6wM4D?O~Cy+y5sFr5F zVMV3zORaS)D$y8pjppH;u}rt8_EyxBy%Uy|(6*bsRKG0*Y|d8;@~Gx{h%DlC-* zYhc@W>^Fo5hG@zxROEW^nAGhxPv#xS>w&~4d4qh!GGxD}kFoIq+k_%Tm%HMdyxF@z zf7Tm>LJFL_7mVYGf0s8%s|PmZB>o6i#0XQ`F#RF3_+*qHKQI#crr_b;X3r--`RhY6 zi3-nS8)hcyF7@qe9OXJ{xPxBk=OJMf*atQ`P7dt0s4kqmKR%Dxcy;e-sLK!M7049k zO>pm%OuTLpBB`PH7)w=z%Xpu#))Ka_S_zcuY*n>8OcpPsYjLzSqsv|hny8whL%x2Z zAIN`0-fvxr4`>E7;Y|9tq|G+6IE2EPK`Mm3(BP@@{?d6I^hPRna3mTO$83)n@bfi& zczcBSqZr=CiQM$evBMZ2<4|&j2EtBYftkpI3x}7o15{WK24#!P1an~+pFP-CM!C9X?2YY5E{^Z-yy6X5R`rHgRzz`=u9L3(AFBx$y`B;K`2nfZlw6JQQdaf598J$RwH5awk<<)48@H6mC~Etk3{_MmyxaHin;)=XMy1MWWy0!#+XUx53C$R5*}6Evk5OH7&@3kkX8KcT_tJ6EN=v zo58dwPxflU2fP?IPrgb(_!$dgI1DG3hJ&I`_nDIk-jcc-$DnUodTd0vowY6`-wyZ| znr*xik_En}UwhbC-(FORm;Tx$|4@dddfV(_+$4Pk3Ab2>t@+l~)ORH11JJM4)yQx3gj`2e( zbMGKiJdGdFTsgOZca59AQolv)7If?gbi@pnRykKsTo&4F&ZU4!c26>ZT+BzG z-aW*%*|hLItjPu}jv0sTQbbUmJH!;0wUO7}8;Mw8q%B~G0^9>e+nS${Fa_v>$ciqA zkM%)fqX0JJ6AYZM#g}JWnj622R!zK4hlMWA@#)Quvl^M*GMiY$63zU?N!1Xd-kU}@ zJ}XA~`r;-zbfgZ8tT|8dYYWH#W6K#BcRJ4}A{mt`=L~Y+wX7&oJXUK?Pz+Jl+{hXh zpsL7hajgK;AKPb)6y1pgw%0O=qAw;@e3g=F=H@bB3dX?J0Ys7*k6&LK0Ksj<;N`hJ z%i_XdG6$XC|5b;?jq+ET4yK>3_JlbVI}m;msKS z$*jn<9+$6>!K`nXCLx$1AOl?irHc6Jm-4176GP_H1uis>1IEoa56pZv>0THHQ+rOIsnUs@rIwf1tDNzZGJ4^?_B86tbvfi7n+|AMc zK1t-TR+qi1 zkrU+CD|fhWHY{;L=o<;&7YLu1em#34V#O~$QY=`d}e0gd!JCqyhN5>I{_|ch~k`%nfu~l`-DO4?VEf+ zviyrV6WF)%MONu05ofpe)5q{XeyY$Tndb|Fpke{c9K@4&!e(T{X{Nq&@Y#mX)UFDm zX#g6(FYWV7;X0D?kyQ777t~dN@ZY|AtmgqR@TccuK`s{=$p>dWPOOB~$wU`hUn`in zKM;!iix<*QwKlYs4j-^+_NxKDDm?l(Z7p@f7`gJ9|9B`ZY-4;FJiH&4M*|imUD!2UL3<~WoH;+BcDQUM)VM@ z7-$|c4U%jNq8$NX6t@FEP0oCwjCDNoL=?v9_W=6g3P3{Lz9|uE=l*4NpOx5L18)H5 zgI`>#gTexC&KKRB!7gy3*+xNe1=QGw*FqjNDEjHcW7KM50kL9osha5k2lo@wN7NH* zkJ}oP%;QNS(`Qmr0g4IY-!dAi3JKY!-xOfjScO`cpB5sqhT` zN?J;tHl4n2pu#LJ=%aalFNT6iOGA*(U3UD@`LmwC!`}rV z&Bx^D+Gdj2)8s=8622xN)aa|4ANpgC4XMiL`>loQ5#Vt*LLu_q zmEk`IuH2UQv2|FEa88*%84DQMKJ|YcmQJT)iufDy+ew=@UHOkk0WN8~MSpG<1LzL1K)fxf@6hFz`E!YY+W<^jez0gVbq{@hXC-Otz z&XJXqqZwJ^7e!obYbew<9Wi<;$Zhre%);xGEN}c{&m7JD%2Ys z&22-m+6@l`xo={TM5~kr4ZOv?-i|-TCrI%$NbR9(M^_xBBl9`t6s>LyjZfUn_uF^$ zHb6|_)+LMea?}{}w=BR=EMSg^iRa@x7|!`I@+~8Flo_`TkZK82}9*CvAkm`x`{jE--&CJc~9120cYJM%ObVr2|*Qo>S6Fe2` znIa!06OGMGO0GFq%(}1)Z}@YV|ET|sfpcn`c)1+8zqs=1JA>V$sS9}`AHWA8^uC_C z*YiV8jUu@*>Z=~6RyU6y_U+NQ&~GKDiocV4xrRzm*3&9Q<%WJ$5CItuXn$P!BKIJ} zSx6yoGsS#f)HJOs7LQB-acmg~EB}i6Al<~s?`&fo<3ndQcb~`c8F~V{lHHOEMVukl zcSGDq6KAF~-i+PADqHs;d&4e2ZsEPl$eMf`YUd07U7ch*CiqjZ2KBB|&9HQQi7~`< z_Flwb-NB9rMnvN-g30^HaB$yGBKS{RyLqLPrN`JO>%p9)a!`Fae3vSN)6=rW0NH#DTPC^)Kg0a(F~RDvL0i-Hy^y8 z`8PdCI=6|(iu0FI3k6TZ;$L{rD)-SGh04d=S~{>L!F`)hWT;ze|4hafIlp*mVm8~- z=I54#kn_8kUsvKh2s@e>cN){5ObQ8ydEVNk4Q}M_(Wsx@@;MO**-)hQivgo4rQ)vx zS|hpL`c3t5;_1j zQcESO*rI7V{YhmTJ$2*?d#nkl_h7q(P0{F0buxYhzhqv3EG)u`&W z>dE16O(ky7JeAgnn2{1px1vQ%P;RH9n^~Z_VYg68UVgo~28oNcQ zeW>8=?liDFd=vc$Iww|UC(T%rT@dOmjOzhz&V3`)e_Wc> zy?pq-vsHHfF-LbSH;rHNJW3Rtj2B_9S?n`HsRJ%k>bT(3$X`_Oa`{PUPj%Rbb)syS ziwT|EXc2j|pBVJ#KBy3?OEfFLA2a>~^CRZ7x{64Hf+52!Z~H~6eD zP9yYA?UtOH1nr-zGxx$>^Ysw!;UV{iWMJktarE)ub$#h*!w#+%T#s^*sjh|{a7aAs zygs$uKD2gsP|KQ?$shyI}vscF`h zI%Z~{_%AUaX76Q)ySe^Z(2OT4-VU2~9f!sGE8`3FiB0`G^y^lxpYO%BFBJud(?0v= zkTY78*kNALHraF1cBJG)XNh%+iFVxq?-^i(QyY7BDOPpdP4DCX-rfEC$wsv2WWl5# zn-CRz>6}i(Vo#ooEEwk;&WUb}-*znNA3un2CnLM-{&fvHq5{Y}vH+-n5{FxNljoNq z{eq%h2xPP6ly<)2=IG+aY4&HI&wJ!JPLME6uwQAjZevrwD}MQg|B{Q@`}fDs@#eEm zcq;5CA<7=JdnX6$^j`f}hw30REJc6$H64mFhnH{n=oveab6X@LS627mhSlXNjy0Ep zE=mB*b+5s8d@$piri0uV+nKCgfXL$rLcsH|(Yn+^ zp>+0)q!uj6N1|OAt(Z%ls6#MZ=ZMB-vu~eTfeSgFr;A^OV9SZuUE%uTgAqHVp>%E3 zfUwXSQ-v_LP~Jln9T}O6_oI_3) zcTihHu#vWecadZi72S{AUMJVQ<-mzX(})OSR_ z4a0TYCo!sS%|^H6p|0qZH$Lw*aapNh!;(z0FT^$1f*QAt8MLa$v9A#fbsbMUHO7x! zt*{VT)MlnuXua)jpEtf}H*;8~Zquknf`n5Y#5gO|<6A?^44mQl9Dv%DJ#ZL=FJcoX zOFq_{AWz}icqC1&#~o|;>YiWu7r?r6CHPq~rUj+ZwV!zxOHR%9niH!HLx;IHiA}Y~O7FS{#r>`4yU2H0qF7(Py88Q9$fTctmV253A!XCy!^f@4ayb@!LgK(p=8LI9*(F}V?`ZY7Yo8cTdgd)5Y>S# z`|i){9fEu21XA=cCE^Zr;`ANW>$@bG#SPrW^jUgV2$G#}7<^Wh-n!an?)4Cv=H~pl zJsN7qHl!>2HWzOrwyQwi6QUjD{aoNNL;-h4=f&D;7)O8{M$9_J^U49QL4m}eeZq}J z2u>hHmHu_l{33n83gp0<_u1tihncJm(cIy&yS+6 zPhZcYyEO@v!JG6I?XQUJe=%rOZ1S2iaAG3CG8mz-;b2$_?-1`uQd+GK14Mq?BmSEn z+d%{VV9+E#eR*qTs3koi}L1g?;}KMMu(Tag@M6!PX_FO%M? zdAw9;+o~J#(O^2=Oq;l*@$U77K9)CXS8 zUnA0B^V$n-_kpMNz<|^-?)mxcuN^o%G^#vmD36_ubh?4ezGINvW=meqP6#9@X|6WK zNwsaoOuEdUBFJfe-mciS__!jgGN3}h8r{t;M#mIdlU_JtOm-K|ILa?cd!C+`d%61f zoXDtY{h+=2BPXwwqkIZlOgTMC)5>->dYi{F>{+|HC3`PHHjCtgJGiw)c;CevH2_j2 zDtcto7C`o4v8VF1JyhhiEWm@FwIQ4ruZ`%@1Mms8waE%QYwkp%w+Jy+O z-aYM~hZbkw@Rsj{FDNU`afcP$>{nLca%sOaKsDDM$v>>bSjjuBMk)|p;1=Ss$`!9G|lDFm$nQDz| zYls*Rl+jvQcZySN%<6;WEJnT2v#63o8Eneo4=VMKh2S5yjnONXmhFyd$C6S&uV>}2 z=i$I(@>3VY%*)KxssfQG-iJZ|oDe7qsH>!P-)>!>33e)WIQ-97hIxrR&=Fdw2A8$~!A(>$%d|^0h18+?>p7i>Qi_xlJXrAWe zZWa>+SCzu*&(*6(dtz{G(`0kkV^jWi-ovDo+O#Bv@VPmfbY3V~%AW7vm<^TK^O%-D zw?6j7#Ur;q(aEb$eywWGp5c4^GJ*Ve3*f)^{Qq3^ETBFk7_|=uY29ul0KS{FxPn-f Ih+e?|0IgKN8~^|S diff --git a/vendor/github.com/moul/anonuuid/cmd/anonuuid/main.go b/vendor/github.com/moul/anonuuid/cmd/anonuuid/main.go deleted file mode 100644 index 1d9119b6a1..0000000000 --- a/vendor/github.com/moul/anonuuid/cmd/anonuuid/main.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "os" - "path" - - "github.com/moul/anonuuid" - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -// main is the entrypoint -func main() { - app := cli.NewApp() - app.Name = path.Base(os.Args[0]) - app.Author = "Manfred Touron" - app.Email = "https://github.com/moul" - app.Version = "1.0.0-dev" - app.Usage = "Anonymize UUIDs outputs" - - app.Flags = []cli.Flag{ - cli.BoolFlag{ - Name: "hexspeak", - Usage: "Generate hexspeak style fake UUIDs", - }, - cli.BoolFlag{ - Name: "random, r", - Usage: "Generate random fake UUIDs", - }, - cli.BoolFlag{ - Name: "keep-beginning", - Usage: "Keep first part of the UUID unchanged", - }, - cli.BoolFlag{ - Name: "keep-end", - Usage: "Keep last part of the UUID unchanged", - }, - cli.StringFlag{ - Name: "prefix, p", - Usage: "Prefix generated UUIDs", - }, - cli.StringFlag{ - Name: "suffix", - Usage: "Suffix generated UUIDs", - }, - } - - app.Action = action - app.Run(os.Args) -} - -func action(c *cli.Context) { - scanner := bufio.NewScanner(os.Stdin) - - anonuuid := anonuuid.New() - - anonuuid.Hexspeak = c.Bool("hexspeak") - anonuuid.Random = c.Bool("random") - anonuuid.Prefix = c.String("prefix") - anonuuid.Suffix = c.String("suffix") - anonuuid.KeepBeginning = c.Bool("keep-beginning") - anonuuid.KeepEnd = c.Bool("keep-end") - - for scanner.Scan() { - line := scanner.Text() - fmt.Println(anonuuid.Sanitize(line)) - } -} diff --git a/vendor/github.com/moul/anonuuid/contrib/homebrew/anonuuid.rb b/vendor/github.com/moul/anonuuid/contrib/homebrew/anonuuid.rb deleted file mode 100644 index 623aeafaa1..0000000000 --- a/vendor/github.com/moul/anonuuid/contrib/homebrew/anonuuid.rb +++ /dev/null @@ -1,33 +0,0 @@ -require "language/go" - -class Anonuuid < Formula - desc "Anonymize streams" - homepage "https://github.com/moul/anonuuid" - url "https://github.com/moul/anonuuid/archive/v1.0.0.tar.gz" - sha256 "37d6ff3931276c7e8eac6d8d5c34d0deb1a649567dc2c4756fc4f74637a0eb51" - - head "https://github.com/moul/anonuuid.git" - - depends_on "go" => :build - - def install - ENV["GOPATH"] = buildpath - ENV["CGO_ENABLED"] = "0" - ENV.prepend_create_path "PATH", buildpath/"bin" - - mkdir_p buildpath/"src/github.com/moul" - ln_s buildpath, buildpath/"src/github.com/moul/anonuuid" - Language::Go.stage_deps resources, buildpath/"src" - - system "go", "get", "github.com/codegangsta/cli" - system "go", "build", "-o", "anonuuid", "./cmd/anonuuid" - bin.install "anonuuid" - - # FIXME: add autocompletion - end - - test do - output = shell_output(bin/"anonuuid --version") - assert output.include? "anonuuid version" - end -end diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/LICENSE b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/LICENSE deleted file mode 100644 index 5515ccfb71..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2013 Jeremy Saenz -All Rights Reserved. - -MIT LICENSE - -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/moul/anonuuid/vendor/github.com/codegangsta/cli/README.md b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/README.md deleted file mode 100644 index 85b9cda020..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/README.md +++ /dev/null @@ -1,308 +0,0 @@ -[![Build Status](https://travis-ci.org/codegangsta/cli.png?branch=master)](https://travis-ci.org/codegangsta/cli) - -# cli.go -cli.go is simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way. - -You can view the API docs here: -http://godoc.org/github.com/codegangsta/cli - -## Overview -Command line apps are usually so tiny that there is absolutely no reason why your code should *not* be self-documenting. Things like generating help text and parsing command flags/options should not hinder productivity when writing a command line app. - -**This is where cli.go comes into play.** cli.go makes command line programming fun, organized, and expressive! - -## Installation -Make sure you have a working Go environment (go 1.1+ is *required*). [See the install instructions](http://golang.org/doc/install.html). - -To install `cli.go`, simply run: -``` -$ go get github.com/codegangsta/cli -``` - -Make sure your `PATH` includes to the `$GOPATH/bin` directory so your commands can be easily used: -``` -export PATH=$PATH:$GOPATH/bin -``` - -## Getting Started -One of the philosophies behind cli.go is that an API should be playful and full of discovery. So a cli.go app can be as little as one line of code in `main()`. - -``` go -package main - -import ( - "os" - "github.com/codegangsta/cli" -) - -func main() { - cli.NewApp().Run(os.Args) -} -``` - -This app will run and show help text, but is not very useful. Let's give an action to execute and some help documentation: - -``` go -package main - -import ( - "os" - "github.com/codegangsta/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "boom" - app.Usage = "make an explosive entrance" - app.Action = func(c *cli.Context) { - println("boom! I say!") - } - - app.Run(os.Args) -} -``` - -Running this already gives you a ton of functionality, plus support for things like subcommands and flags, which are covered below. - -## Example - -Being a programmer can be a lonely job. Thankfully by the power of automation that is not the case! Let's create a greeter app to fend off our demons of loneliness! - -Start by creating a directory named `greet`, and within it, add a file, `greet.go` with the following code in it: - -``` go -package main - -import ( - "os" - "github.com/codegangsta/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "greet" - app.Usage = "fight the loneliness!" - app.Action = func(c *cli.Context) { - println("Hello friend!") - } - - app.Run(os.Args) -} -``` - -Install our command to the `$GOPATH/bin` directory: - -``` -$ go install -``` - -Finally run our new command: - -``` -$ greet -Hello friend! -``` - -cli.go also generates some bitchass help text: -``` -$ greet help -NAME: - greet - fight the loneliness! - -USAGE: - greet [global options] command [command options] [arguments...] - -VERSION: - 0.0.0 - -COMMANDS: - help, h Shows a list of commands or help for one command - -GLOBAL OPTIONS - --version Shows version information -``` - -### Arguments -You can lookup arguments by calling the `Args` function on `cli.Context`. - -``` go -... -app.Action = func(c *cli.Context) { - println("Hello", c.Args()[0]) -} -... -``` - -### Flags -Setting and querying flags is simple. -``` go -... -app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - }, -} -app.Action = func(c *cli.Context) { - name := "someone" - if len(c.Args()) > 0 { - name = c.Args()[0] - } - if c.String("lang") == "spanish" { - println("Hola", name) - } else { - println("Hello", name) - } -} -... -``` - -See full list of flags at http://godoc.org/github.com/codegangsta/cli - -#### Alternate Names - -You can set alternate (or short) names for flags by providing a comma-delimited list for the `Name`. e.g. - -``` go -app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - }, -} -``` - -That flag can then be set with `--lang spanish` or `-l spanish`. Note that giving two different forms of the same flag in the same command invocation is an error. - -#### Values from the Environment - -You can also have the default value set from the environment via `EnvVar`. e.g. - -``` go -app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "APP_LANG", - }, -} -``` - -The `EnvVar` may also be given as a comma-delimited "cascade", where the first environment variable that resolves is used as the default. - -``` go -app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", - }, -} -``` - -### Subcommands - -Subcommands can be defined for a more git-like command line app. -```go -... -app.Commands = []cli.Command{ - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) { - println("added task: ", c.Args().First()) - }, - }, - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) { - println("completed task: ", c.Args().First()) - }, - }, - { - Name: "template", - Aliases: []string{"r"}, - Usage: "options for task templates", - Subcommands: []cli.Command{ - { - Name: "add", - Usage: "add a new template", - Action: func(c *cli.Context) { - println("new task template: ", c.Args().First()) - }, - }, - { - Name: "remove", - Usage: "remove an existing template", - Action: func(c *cli.Context) { - println("removed task template: ", c.Args().First()) - }, - }, - }, - }, -} -... -``` - -### Bash Completion - -You can enable completion commands by setting the `EnableBashCompletion` -flag on the `App` object. By default, this setting will only auto-complete to -show an app's subcommands, but you can write your own completion methods for -the App or its subcommands. -```go -... -var tasks = []string{"cook", "clean", "laundry", "eat", "sleep", "code"} -app := cli.NewApp() -app.EnableBashCompletion = true -app.Commands = []cli.Command{ - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) { - println("completed task: ", c.Args().First()) - }, - BashComplete: func(c *cli.Context) { - // This will complete if no args are passed - if len(c.Args()) > 0 { - return - } - for _, t := range tasks { - fmt.Println(t) - } - }, - } -} -... -``` - -#### To Enable - -Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while -setting the `PROG` variable to the name of your program: - -`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` - -#### To Distribute - -Copy and modify `autocomplete/bash_autocomplete` to use your program name -rather than `$PROG` and have the user copy the file into -`/etc/bash_completion.d/` (or automatically install it there if you are -distributing a package). Alternatively you can just document that users should -source the generic `autocomplete/bash_autocomplete` with `$PROG` set to your -program name in their bash configuration. - -## Contribution Guidelines -Feel free to put up a pull request to fix a bug or maybe add a feature. I will give it a code review and make sure that it does not break backwards compatibility. If I or any other collaborators agree that it is in line with the vision of the project, we will work with you to get the code into a mergeable state and merge it into the master branch. - -If you have contributed something significant to the project, I will most likely add you as a collaborator. As a collaborator you are given the ability to merge others pull requests. It is very important that new code does not break existing code, so be careful about what code you do choose to merge. If you have any questions feel free to link @codegangsta to the issue in question and we can review it together. - -If you feel like you have contributed to the project but have not yet been added as a collaborator, I probably forgot to add you. Hit @codegangsta up over email and we will get it figured out. diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app.go deleted file mode 100644 index e7caec99bd..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app.go +++ /dev/null @@ -1,308 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "time" -) - -// App is the main structure of a cli application. It is recomended that -// an app be created with the cli.NewApp() function -type App struct { - // The name of the program. Defaults to os.Args[0] - Name string - // Description of the program. - Usage string - // Version of the program - Version string - // List of commands to execute - Commands []Command - // List of flags to parse - Flags []Flag - // Boolean to enable bash completion commands - EnableBashCompletion bool - // Boolean to hide built-in help command - HideHelp bool - // Boolean to hide built-in version flag - HideVersion bool - // An action to execute when the bash-completion flag is set - BashComplete func(context *Context) - // An action to execute before any subcommands are run, but after the context is ready - // If a non-nil error is returned, no subcommands are run - Before func(context *Context) error - // An action to execute after any subcommands are run, but after the subcommand has finished - // It is run even if Action() panics - After func(context *Context) error - // The action to execute when no subcommands are specified - Action func(context *Context) - // Execute this function if the proper command cannot be found - CommandNotFound func(context *Context, command string) - // Compilation date - Compiled time.Time - // List of all authors who contributed - Authors []Author - // Copyright of the binary if any - Copyright string - // Name of Author (Note: Use App.Authors, this is deprecated) - Author string - // Email of Author (Note: Use App.Authors, this is deprecated) - Email string - // Writer writer to write output to - Writer io.Writer -} - -// Tries to find out when this binary was compiled. -// Returns the current time if it fails to find it. -func compileTime() time.Time { - info, err := os.Stat(os.Args[0]) - if err != nil { - return time.Now() - } - return info.ModTime() -} - -// Creates a new cli Application with some reasonable defaults for Name, Usage, Version and Action. -func NewApp() *App { - return &App{ - Name: os.Args[0], - Usage: "A new cli application", - Version: "0.0.0", - BashComplete: DefaultAppComplete, - Action: helpCommand.Action, - Compiled: compileTime(), - Writer: os.Stdout, - } -} - -// Entry point to the cli app. Parses the arguments slice and routes to the proper flag/args combination -func (a *App) Run(arguments []string) (err error) { - if a.Author != "" || a.Email != "" { - a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) - } - - // append help to commands - if a.Command(helpCommand.Name) == nil && !a.HideHelp { - a.Commands = append(a.Commands, helpCommand) - if (HelpFlag != BoolFlag{}) { - a.appendFlag(HelpFlag) - } - } - - //append version/help flags - if a.EnableBashCompletion { - a.appendFlag(BashCompletionFlag) - } - - if !a.HideVersion { - a.appendFlag(VersionFlag) - } - - // parse flags - set := flagSet(a.Name, a.Flags) - set.SetOutput(ioutil.Discard) - err = set.Parse(arguments[1:]) - nerr := normalizeFlags(a.Flags, set) - if nerr != nil { - fmt.Fprintln(a.Writer, nerr) - context := NewContext(a, set, nil) - ShowAppHelp(context) - return nerr - } - context := NewContext(a, set, nil) - - if err != nil { - fmt.Fprintln(a.Writer, "Incorrect Usage.") - fmt.Fprintln(a.Writer) - ShowAppHelp(context) - return err - } - - if checkCompletions(context) { - return nil - } - - if checkHelp(context) { - return nil - } - - if checkVersion(context) { - return nil - } - - if a.After != nil { - defer func() { - afterErr := a.After(context) - if afterErr != nil { - if err != nil { - err = NewMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if a.Before != nil { - err := a.Before(context) - if err != nil { - return err - } - } - - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) - } - } - - // Run default Action - a.Action(context) - return nil -} - -// Another entry point to the cli app, takes care of passing arguments and error handling -func (a *App) RunAndExitOnError() { - if err := a.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -// Invokes the subcommand given the context, parses ctx.Args() to generate command-specific flags -func (a *App) RunAsSubcommand(ctx *Context) (err error) { - // append help to commands - if len(a.Commands) > 0 { - if a.Command(helpCommand.Name) == nil && !a.HideHelp { - a.Commands = append(a.Commands, helpCommand) - if (HelpFlag != BoolFlag{}) { - a.appendFlag(HelpFlag) - } - } - } - - // append flags - if a.EnableBashCompletion { - a.appendFlag(BashCompletionFlag) - } - - // parse flags - set := flagSet(a.Name, a.Flags) - set.SetOutput(ioutil.Discard) - err = set.Parse(ctx.Args().Tail()) - nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, ctx) - - if nerr != nil { - fmt.Fprintln(a.Writer, nerr) - fmt.Fprintln(a.Writer) - if len(a.Commands) > 0 { - ShowSubcommandHelp(context) - } else { - ShowCommandHelp(ctx, context.Args().First()) - } - return nerr - } - - if err != nil { - fmt.Fprintln(a.Writer, "Incorrect Usage.") - fmt.Fprintln(a.Writer) - ShowSubcommandHelp(context) - return err - } - - if checkCompletions(context) { - return nil - } - - if len(a.Commands) > 0 { - if checkSubcommandHelp(context) { - return nil - } - } else { - if checkCommandHelp(ctx, context.Args().First()) { - return nil - } - } - - if a.After != nil { - defer func() { - afterErr := a.After(context) - if afterErr != nil { - if err != nil { - err = NewMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if a.Before != nil { - err := a.Before(context) - if err != nil { - return err - } - } - - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) - } - } - - // Run default Action - a.Action(context) - - return nil -} - -// Returns the named command on App. Returns nil if the command does not exist -func (a *App) Command(name string) *Command { - for _, c := range a.Commands { - if c.HasName(name) { - return &c - } - } - - return nil -} - -func (a *App) hasFlag(flag Flag) bool { - for _, f := range a.Flags { - if flag == f { - return true - } - } - - return false -} - -func (a *App) appendFlag(flag Flag) { - if !a.hasFlag(flag) { - a.Flags = append(a.Flags, flag) - } -} - -// Author represents someone who has contributed to a cli project. -type Author struct { - Name string // The Authors name - Email string // The Authors email -} - -// String makes Author comply to the Stringer interface, to allow an easy print in the templating process -func (a Author) String() string { - e := "" - if a.Email != "" { - e = "<" + a.Email + "> " - } - - return fmt.Sprintf("%v %v", a.Name, e) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app_test.go deleted file mode 100644 index 87e90ec3eb..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/app_test.go +++ /dev/null @@ -1,869 +0,0 @@ -package cli_test - -import ( - "bytes" - "flag" - "fmt" - "io" - "os" - "strings" - "testing" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -func ExampleApp() { - // set args for examples sake - os.Args = []string{"greet", "--name", "Jeremy"} - - app := cli.NewApp() - app.Name = "greet" - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, - } - app.Action = func(c *cli.Context) { - fmt.Printf("Hello %v\n", c.String("name")) - } - app.Author = "Harrison" - app.Email = "harrison@lolwut.com" - app.Authors = []cli.Author{cli.Author{Name: "Oliver Allen", Email: "oliver@toyshop.com"}} - app.Run(os.Args) - // Output: - // Hello Jeremy -} - -func ExampleAppSubcommand() { - // set args for examples sake - os.Args = []string{"say", "hi", "english", "--name", "Jeremy"} - app := cli.NewApp() - app.Name = "say" - app.Commands = []cli.Command{ - { - Name: "hello", - Aliases: []string{"hi"}, - Usage: "use it to see a description", - Description: "This is how we describe hello the function", - Subcommands: []cli.Command{ - { - Name: "english", - Aliases: []string{"en"}, - Usage: "sends a greeting in english", - Description: "greets someone in english", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "name", - Value: "Bob", - Usage: "Name of the person to greet", - }, - }, - Action: func(c *cli.Context) { - fmt.Println("Hello,", c.String("name")) - }, - }, - }, - }, - } - - app.Run(os.Args) - // Output: - // Hello, Jeremy -} - -func ExampleAppHelp() { - // set args for examples sake - os.Args = []string{"greet", "h", "describeit"} - - app := cli.NewApp() - app.Name = "greet" - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, - } - app.Commands = []cli.Command{ - { - Name: "describeit", - Aliases: []string{"d"}, - Usage: "use it to see a description", - Description: "This is how we describe describeit the function", - Action: func(c *cli.Context) { - fmt.Printf("i like to describe things") - }, - }, - } - app.Run(os.Args) - // Output: - // NAME: - // describeit - use it to see a description - // - // USAGE: - // command describeit [arguments...] - // - // DESCRIPTION: - // This is how we describe describeit the function -} - -func ExampleAppBashComplete() { - // set args for examples sake - os.Args = []string{"greet", "--generate-bash-completion"} - - app := cli.NewApp() - app.Name = "greet" - app.EnableBashCompletion = true - app.Commands = []cli.Command{ - { - Name: "describeit", - Aliases: []string{"d"}, - Usage: "use it to see a description", - Description: "This is how we describe describeit the function", - Action: func(c *cli.Context) { - fmt.Printf("i like to describe things") - }, - }, { - Name: "next", - Usage: "next example", - Description: "more stuff to see when generating bash completion", - Action: func(c *cli.Context) { - fmt.Printf("the next example") - }, - }, - } - - app.Run(os.Args) - // Output: - // describeit - // d - // next - // help - // h -} - -func TestApp_Run(t *testing.T) { - s := "" - - app := cli.NewApp() - app.Action = func(c *cli.Context) { - s = s + c.Args().First() - } - - err := app.Run([]string{"command", "foo"}) - expect(t, err, nil) - err = app.Run([]string{"command", "bar"}) - expect(t, err, nil) - expect(t, s, "foobar") -} - -var commandAppTests = []struct { - name string - expected bool -}{ - {"foobar", true}, - {"batbaz", true}, - {"b", true}, - {"f", true}, - {"bat", false}, - {"nothing", false}, -} - -func TestApp_Command(t *testing.T) { - app := cli.NewApp() - fooCommand := cli.Command{Name: "foobar", Aliases: []string{"f"}} - batCommand := cli.Command{Name: "batbaz", Aliases: []string{"b"}} - app.Commands = []cli.Command{ - fooCommand, - batCommand, - } - - for _, test := range commandAppTests { - expect(t, app.Command(test.name) != nil, test.expected) - } -} - -func TestApp_CommandWithArgBeforeFlags(t *testing.T) { - var parsedOption, firstArg string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, - }, - Action: func(c *cli.Context) { - parsedOption = c.String("option") - firstArg = c.Args().First() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--option", "my-option"}) - - expect(t, parsedOption, "my-option") - expect(t, firstArg, "my-arg") -} - -func TestApp_RunAsSubcommandParseFlags(t *testing.T) { - var context *cli.Context - - a := cli.NewApp() - a.Commands = []cli.Command{ - { - Name: "foo", - Action: func(c *cli.Context) { - context = c - }, - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - }, - }, - Before: func(_ *cli.Context) error { return nil }, - }, - } - a.Run([]string{"", "foo", "--lang", "spanish", "abcd"}) - - expect(t, context.Args().Get(0), "abcd") - expect(t, context.String("lang"), "spanish") -} - -func TestApp_CommandWithFlagBeforeTerminator(t *testing.T) { - var parsedOption string - var args []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, - }, - Action: func(c *cli.Context) { - parsedOption = c.String("option") - args = c.Args() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--option", "my-option", "--", "--notARealFlag"}) - - expect(t, parsedOption, "my-option") - expect(t, args[0], "my-arg") - expect(t, args[1], "--") - expect(t, args[2], "--notARealFlag") -} - -func TestApp_CommandWithNoFlagBeforeTerminator(t *testing.T) { - var args []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Action: func(c *cli.Context) { - args = c.Args() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--", "notAFlagAtAll"}) - - expect(t, args[0], "my-arg") - expect(t, args[1], "--") - expect(t, args[2], "notAFlagAtAll") -} - -func TestApp_Float64Flag(t *testing.T) { - var meters float64 - - app := cli.NewApp() - app.Flags = []cli.Flag{ - cli.Float64Flag{Name: "height", Value: 1.5, Usage: "Set the height, in meters"}, - } - app.Action = func(c *cli.Context) { - meters = c.Float64("height") - } - - app.Run([]string{"", "--height", "1.93"}) - expect(t, meters, 1.93) -} - -func TestApp_ParseSliceFlags(t *testing.T) { - var parsedOption, firstArg string - var parsedIntSlice []int - var parsedStringSlice []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "p", Value: &cli.IntSlice{}, Usage: "set one or more ip addr"}, - cli.StringSliceFlag{Name: "ip", Value: &cli.StringSlice{}, Usage: "set one or more ports to open"}, - }, - Action: func(c *cli.Context) { - parsedIntSlice = c.IntSlice("p") - parsedStringSlice = c.StringSlice("ip") - parsedOption = c.String("option") - firstArg = c.Args().First() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "-p", "22", "-p", "80", "-ip", "8.8.8.8", "-ip", "8.8.4.4"}) - - IntsEquals := func(a, b []int) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true - } - - StrsEquals := func(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true - } - var expectedIntSlice = []int{22, 80} - var expectedStringSlice = []string{"8.8.8.8", "8.8.4.4"} - - if !IntsEquals(parsedIntSlice, expectedIntSlice) { - t.Errorf("%v does not match %v", parsedIntSlice, expectedIntSlice) - } - - if !StrsEquals(parsedStringSlice, expectedStringSlice) { - t.Errorf("%v does not match %v", parsedStringSlice, expectedStringSlice) - } -} - -func TestApp_ParseSliceFlagsWithMissingValue(t *testing.T) { - var parsedIntSlice []int - var parsedStringSlice []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "a", Usage: "set numbers"}, - cli.StringSliceFlag{Name: "str", Usage: "set strings"}, - }, - Action: func(c *cli.Context) { - parsedIntSlice = c.IntSlice("a") - parsedStringSlice = c.StringSlice("str") - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "-a", "2", "-str", "A"}) - - var expectedIntSlice = []int{2} - var expectedStringSlice = []string{"A"} - - if parsedIntSlice[0] != expectedIntSlice[0] { - t.Errorf("%v does not match %v", parsedIntSlice[0], expectedIntSlice[0]) - } - - if parsedStringSlice[0] != expectedStringSlice[0] { - t.Errorf("%v does not match %v", parsedIntSlice[0], expectedIntSlice[0]) - } -} - -func TestApp_DefaultStdout(t *testing.T) { - app := cli.NewApp() - - if app.Writer != os.Stdout { - t.Error("Default output writer not set.") - } -} - -type mockWriter struct { - written []byte -} - -func (fw *mockWriter) Write(p []byte) (n int, err error) { - if fw.written == nil { - fw.written = p - } else { - fw.written = append(fw.written, p...) - } - - return len(p), nil -} - -func (fw *mockWriter) GetWritten() (b []byte) { - return fw.written -} - -func TestApp_SetStdout(t *testing.T) { - w := &mockWriter{} - - app := cli.NewApp() - app.Name = "test" - app.Writer = w - - err := app.Run([]string{"help"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if len(w.written) == 0 { - t.Error("App did not write output to desired writer.") - } -} - -func TestApp_BeforeFunc(t *testing.T) { - beforeRun, subcommandRun := false, false - beforeError := fmt.Errorf("fail") - var err error - - app := cli.NewApp() - - app.Before = func(c *cli.Context) error { - beforeRun = true - s := c.String("opt") - if s == "fail" { - return beforeError - } - - return nil - } - - app.Commands = []cli.Command{ - cli.Command{ - Name: "sub", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "opt"}, - } - - // run with the Before() func succeeding - err = app.Run([]string{"command", "--opt", "succeed", "sub"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if beforeRun == false { - t.Errorf("Before() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } - - // reset - beforeRun, subcommandRun = false, false - - // run with the Before() func failing - err = app.Run([]string{"command", "--opt", "fail", "sub"}) - - // should be the same error produced by the Before func - if err != beforeError { - t.Errorf("Run error expected, but not received") - } - - if beforeRun == false { - t.Errorf("Before() not executed when expected") - } - - if subcommandRun == true { - t.Errorf("Subcommand executed when NOT expected") - } - -} - -func TestApp_AfterFunc(t *testing.T) { - afterRun, subcommandRun := false, false - afterError := fmt.Errorf("fail") - var err error - - app := cli.NewApp() - - app.After = func(c *cli.Context) error { - afterRun = true - s := c.String("opt") - if s == "fail" { - return afterError - } - - return nil - } - - app.Commands = []cli.Command{ - cli.Command{ - Name: "sub", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "opt"}, - } - - // run with the After() func succeeding - err = app.Run([]string{"command", "--opt", "succeed", "sub"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if afterRun == false { - t.Errorf("After() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } - - // reset - afterRun, subcommandRun = false, false - - // run with the Before() func failing - err = app.Run([]string{"command", "--opt", "fail", "sub"}) - - // should be the same error produced by the Before func - if err != afterError { - t.Errorf("Run error expected, but not received") - } - - if afterRun == false { - t.Errorf("After() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } -} - -func TestAppNoHelpFlag(t *testing.T) { - oldFlag := cli.HelpFlag - defer func() { - cli.HelpFlag = oldFlag - }() - - cli.HelpFlag = cli.BoolFlag{} - - app := cli.NewApp() - err := app.Run([]string{"test", "-h"}) - - if err != flag.ErrHelp { - t.Errorf("expected error about missing help flag, but got: %s (%T)", err, err) - } -} - -func TestAppHelpPrinter(t *testing.T) { - oldPrinter := cli.HelpPrinter - defer func() { - cli.HelpPrinter = oldPrinter - }() - - var wasCalled = false - cli.HelpPrinter = func(w io.Writer, template string, data interface{}) { - wasCalled = true - } - - app := cli.NewApp() - app.Run([]string{"-h"}) - - if wasCalled == false { - t.Errorf("Help printer expected to be called, but was not") - } -} - -func TestAppVersionPrinter(t *testing.T) { - oldPrinter := cli.VersionPrinter - defer func() { - cli.VersionPrinter = oldPrinter - }() - - var wasCalled = false - cli.VersionPrinter = func(c *cli.Context) { - wasCalled = true - } - - app := cli.NewApp() - ctx := cli.NewContext(app, nil, nil) - cli.ShowVersion(ctx) - - if wasCalled == false { - t.Errorf("Version printer expected to be called, but was not") - } -} - -func TestAppCommandNotFound(t *testing.T) { - beforeRun, subcommandRun := false, false - app := cli.NewApp() - - app.CommandNotFound = func(c *cli.Context, command string) { - beforeRun = true - } - - app.Commands = []cli.Command{ - cli.Command{ - Name: "bar", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Run([]string{"command", "foo"}) - - expect(t, beforeRun, true) - expect(t, subcommandRun, false) -} - -func TestGlobalFlag(t *testing.T) { - var globalFlag string - var globalFlagSet bool - app := cli.NewApp() - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "global, g", Usage: "global"}, - } - app.Action = func(c *cli.Context) { - globalFlag = c.GlobalString("global") - globalFlagSet = c.GlobalIsSet("global") - } - app.Run([]string{"command", "-g", "foo"}) - expect(t, globalFlag, "foo") - expect(t, globalFlagSet, true) - -} - -func TestGlobalFlagsInSubcommands(t *testing.T) { - subcommandRun := false - parentFlag := false - app := cli.NewApp() - - app.Flags = []cli.Flag{ - cli.BoolFlag{Name: "debug, d", Usage: "Enable debugging"}, - } - - app.Commands = []cli.Command{ - cli.Command{ - Name: "foo", - Flags: []cli.Flag{ - cli.BoolFlag{Name: "parent, p", Usage: "Parent flag"}, - }, - Subcommands: []cli.Command{ - { - Name: "bar", - Action: func(c *cli.Context) { - if c.GlobalBool("debug") { - subcommandRun = true - } - if c.GlobalBool("parent") { - parentFlag = true - } - }, - }, - }, - }, - } - - app.Run([]string{"command", "-d", "foo", "-p", "bar"}) - - expect(t, subcommandRun, true) - expect(t, parentFlag, true) -} - -func TestApp_Run_CommandWithSubcommandHasHelpTopic(t *testing.T) { - var subcommandHelpTopics = [][]string{ - {"command", "foo", "--help"}, - {"command", "foo", "-h"}, - {"command", "foo", "help"}, - } - - for _, flagSet := range subcommandHelpTopics { - t.Logf("==> checking with flags %v", flagSet) - - app := cli.NewApp() - buf := new(bytes.Buffer) - app.Writer = buf - - subCmdBar := cli.Command{ - Name: "bar", - Usage: "does bar things", - } - subCmdBaz := cli.Command{ - Name: "baz", - Usage: "does baz things", - } - cmd := cli.Command{ - Name: "foo", - Description: "descriptive wall of text about how it does foo things", - Subcommands: []cli.Command{subCmdBar, subCmdBaz}, - } - - app.Commands = []cli.Command{cmd} - err := app.Run(flagSet) - - if err != nil { - t.Error(err) - } - - output := buf.String() - t.Logf("output: %q\n", buf.Bytes()) - - if strings.Contains(output, "No help topic for") { - t.Errorf("expect a help topic, got none: \n%q", output) - } - - for _, shouldContain := range []string{ - cmd.Name, cmd.Description, - subCmdBar.Name, subCmdBar.Usage, - subCmdBaz.Name, subCmdBaz.Usage, - } { - if !strings.Contains(output, shouldContain) { - t.Errorf("want help to contain %q, did not: \n%q", shouldContain, output) - } - } - } -} - -func TestApp_Run_SubcommandFullPath(t *testing.T) { - app := cli.NewApp() - buf := new(bytes.Buffer) - app.Writer = buf - - subCmd := cli.Command{ - Name: "bar", - Usage: "does bar things", - } - cmd := cli.Command{ - Name: "foo", - Description: "foo commands", - Subcommands: []cli.Command{subCmd}, - } - app.Commands = []cli.Command{cmd} - - err := app.Run([]string{"command", "foo", "bar", "--help"}) - if err != nil { - t.Error(err) - } - - output := buf.String() - if !strings.Contains(output, "foo bar - does bar things") { - t.Errorf("expected full path to subcommand: %s", output) - } - if !strings.Contains(output, "command foo bar [arguments...]") { - t.Errorf("expected full path to subcommand: %s", output) - } -} - -func TestApp_Run_Help(t *testing.T) { - var helpArguments = [][]string{{"boom", "--help"}, {"boom", "-h"}, {"boom", "help"}} - - for _, args := range helpArguments { - buf := new(bytes.Buffer) - - t.Logf("==> checking with arguments %v", args) - - app := cli.NewApp() - app.Name = "boom" - app.Usage = "make an explosive entrance" - app.Writer = buf - app.Action = func(c *cli.Context) { - buf.WriteString("boom I say!") - } - - err := app.Run(args) - if err != nil { - t.Error(err) - } - - output := buf.String() - t.Logf("output: %q\n", buf.Bytes()) - - if !strings.Contains(output, "boom - make an explosive entrance") { - t.Errorf("want help to contain %q, did not: \n%q", "boom - make an explosive entrance", output) - } - } -} - -func TestApp_Run_Version(t *testing.T) { - var versionArguments = [][]string{{"boom", "--version"}, {"boom", "-v"}} - - for _, args := range versionArguments { - buf := new(bytes.Buffer) - - t.Logf("==> checking with arguments %v", args) - - app := cli.NewApp() - app.Name = "boom" - app.Usage = "make an explosive entrance" - app.Version = "0.1.0" - app.Writer = buf - app.Action = func(c *cli.Context) { - buf.WriteString("boom I say!") - } - - err := app.Run(args) - if err != nil { - t.Error(err) - } - - output := buf.String() - t.Logf("output: %q\n", buf.Bytes()) - - if !strings.Contains(output, "0.1.0") { - t.Errorf("want version to contain %q, did not: \n%q", "0.1.0", output) - } - } -} - -func TestApp_Run_DoesNotOverwriteErrorFromBefore(t *testing.T) { - app := cli.NewApp() - app.Action = func(c *cli.Context) {} - app.Before = func(c *cli.Context) error { return fmt.Errorf("before error") } - app.After = func(c *cli.Context) error { return fmt.Errorf("after error") } - - err := app.Run([]string{"foo"}) - if err == nil { - t.Fatalf("expected to recieve error from Run, got none") - } - - if !strings.Contains(err.Error(), "before error") { - t.Errorf("expected text of error from Before method, but got none in \"%v\"", err) - } - if !strings.Contains(err.Error(), "after error") { - t.Errorf("expected text of error from After method, but got none in \"%v\"", err) - } -} - -func TestApp_Run_SubcommandDoesNotOverwriteErrorFromBefore(t *testing.T) { - app := cli.NewApp() - app.Commands = []cli.Command{ - cli.Command{ - Name: "bar", - Before: func(c *cli.Context) error { return fmt.Errorf("before error") }, - After: func(c *cli.Context) error { return fmt.Errorf("after error") }, - }, - } - - err := app.Run([]string{"foo", "bar"}) - if err == nil { - t.Fatalf("expected to recieve error from Run, got none") - } - - if !strings.Contains(err.Error(), "before error") { - t.Errorf("expected text of error from Before method, but got none in \"%v\"", err) - } - if !strings.Contains(err.Error(), "after error") { - t.Errorf("expected text of error from After method, but got none in \"%v\"", err) - } -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli.go deleted file mode 100644 index 31dc9124d1..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package cli provides a minimal framework for creating and organizing command line -// Go applications. cli is designed to be easy to understand and write, the most simple -// cli application can be written as follows: -// func main() { -// cli.NewApp().Run(os.Args) -// } -// -// Of course this application does not do much, so let's make this an actual application: -// func main() { -// app := cli.NewApp() -// app.Name = "greet" -// app.Usage = "say a greeting" -// app.Action = func(c *cli.Context) { -// println("Greetings") -// } -// -// app.Run(os.Args) -// } -package cli - -import ( - "strings" -) - -type MultiError struct { - Errors []error -} - -func NewMultiError(err ...error) MultiError { - return MultiError{Errors: err} -} - -func (m MultiError) Error() string { - errs := make([]string, len(m.Errors)) - for i, err := range m.Errors { - errs[i] = err.Error() - } - - return strings.Join(errs, "\n") -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli_test.go deleted file mode 100644 index f6fcd4d262..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/cli_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package cli_test - -import ( - "os" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -func Example() { - app := cli.NewApp() - app.Name = "todo" - app.Usage = "task list on the command line" - app.Commands = []cli.Command{ - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) { - println("added task: ", c.Args().First()) - }, - }, - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) { - println("completed task: ", c.Args().First()) - }, - }, - } - - app.Run(os.Args) -} - -func ExampleSubcommand() { - app := cli.NewApp() - app.Name = "say" - app.Commands = []cli.Command{ - { - Name: "hello", - Aliases: []string{"hi"}, - Usage: "use it to see a description", - Description: "This is how we describe hello the function", - Subcommands: []cli.Command{ - { - Name: "english", - Aliases: []string{"en"}, - Usage: "sends a greeting in english", - Description: "greets someone in english", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "name", - Value: "Bob", - Usage: "Name of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Hello, ", c.String("name")) - }, - }, { - Name: "spanish", - Aliases: []string{"sp"}, - Usage: "sends a greeting in spanish", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "surname", - Value: "Jones", - Usage: "Surname of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Hola, ", c.String("surname")) - }, - }, { - Name: "french", - Aliases: []string{"fr"}, - Usage: "sends a greeting in french", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "nickname", - Value: "Stevie", - Usage: "Nickname of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Bonjour, ", c.String("nickname")) - }, - }, - }, - }, { - Name: "bye", - Usage: "says goodbye", - Action: func(c *cli.Context) { - println("bye") - }, - }, - } - - app.Run(os.Args) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command.go deleted file mode 100644 index 54617afa74..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command.go +++ /dev/null @@ -1,200 +0,0 @@ -package cli - -import ( - "fmt" - "io/ioutil" - "strings" -) - -// Command is a subcommand for a cli.App. -type Command struct { - // The name of the command - Name string - // short name of the command. Typically one character (deprecated, use `Aliases`) - ShortName string - // A list of aliases for the command - Aliases []string - // A short description of the usage of this command - Usage string - // A longer explanation of how the command works - Description string - // The function to call when checking for bash command completions - BashComplete func(context *Context) - // An action to execute before any sub-subcommands are run, but after the context is ready - // If a non-nil error is returned, no sub-subcommands are run - Before func(context *Context) error - // An action to execute after any subcommands are run, but after the subcommand has finished - // It is run even if Action() panics - After func(context *Context) error - // The function to call when this command is invoked - Action func(context *Context) - // List of child commands - Subcommands []Command - // List of flags to parse - Flags []Flag - // Treat all flags as normal arguments if true - SkipFlagParsing bool - // Boolean to hide built-in help command - HideHelp bool - - commandNamePath []string -} - -// Returns the full name of the command. -// For subcommands this ensures that parent commands are part of the command path -func (c Command) FullName() string { - if c.commandNamePath == nil { - return c.Name - } - return strings.Join(c.commandNamePath, " ") -} - -// Invokes the command given the context, parses ctx.Args() to generate command-specific flags -func (c Command) Run(ctx *Context) error { - if len(c.Subcommands) > 0 || c.Before != nil || c.After != nil { - return c.startApp(ctx) - } - - if !c.HideHelp && (HelpFlag != BoolFlag{}) { - // append help to flags - c.Flags = append( - c.Flags, - HelpFlag, - ) - } - - if ctx.App.EnableBashCompletion { - c.Flags = append(c.Flags, BashCompletionFlag) - } - - set := flagSet(c.Name, c.Flags) - set.SetOutput(ioutil.Discard) - - firstFlagIndex := -1 - terminatorIndex := -1 - for index, arg := range ctx.Args() { - if arg == "--" { - terminatorIndex = index - break - } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { - firstFlagIndex = index - } - } - - var err error - if firstFlagIndex > -1 && !c.SkipFlagParsing { - args := ctx.Args() - regularArgs := make([]string, len(args[1:firstFlagIndex])) - copy(regularArgs, args[1:firstFlagIndex]) - - var flagArgs []string - if terminatorIndex > -1 { - flagArgs = args[firstFlagIndex:terminatorIndex] - regularArgs = append(regularArgs, args[terminatorIndex:]...) - } else { - flagArgs = args[firstFlagIndex:] - } - - err = set.Parse(append(flagArgs, regularArgs...)) - } else { - err = set.Parse(ctx.Args().Tail()) - } - - if err != nil { - fmt.Fprintln(ctx.App.Writer, "Incorrect Usage.") - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) - return err - } - - nerr := normalizeFlags(c.Flags, set) - if nerr != nil { - fmt.Fprintln(ctx.App.Writer, nerr) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) - return nerr - } - context := NewContext(ctx.App, set, ctx) - - if checkCommandCompletions(context, c.Name) { - return nil - } - - if checkCommandHelp(context, c.Name) { - return nil - } - context.Command = c - c.Action(context) - return nil -} - -func (c Command) Names() []string { - names := []string{c.Name} - - if c.ShortName != "" { - names = append(names, c.ShortName) - } - - return append(names, c.Aliases...) -} - -// Returns true if Command.Name or Command.ShortName matches given name -func (c Command) HasName(name string) bool { - for _, n := range c.Names() { - if n == name { - return true - } - } - return false -} - -func (c Command) startApp(ctx *Context) error { - app := NewApp() - - // set the name and usage - app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) - if c.Description != "" { - app.Usage = c.Description - } else { - app.Usage = c.Usage - } - - // set CommandNotFound - app.CommandNotFound = ctx.App.CommandNotFound - - // set the flags and commands - app.Commands = c.Subcommands - app.Flags = c.Flags - app.HideHelp = c.HideHelp - - app.Version = ctx.App.Version - app.HideVersion = ctx.App.HideVersion - app.Compiled = ctx.App.Compiled - app.Author = ctx.App.Author - app.Email = ctx.App.Email - app.Writer = ctx.App.Writer - - // bash completion - app.EnableBashCompletion = ctx.App.EnableBashCompletion - if c.BashComplete != nil { - app.BashComplete = c.BashComplete - } - - // set the actions - app.Before = c.Before - app.After = c.After - if c.Action != nil { - app.Action = c.Action - } else { - app.Action = helpSubcommand.Action - } - - var newCmds []Command - for _, cc := range app.Commands { - cc.commandNamePath = []string{c.Name, cc.Name} - newCmds = append(newCmds, cc) - } - app.Commands = newCmds - - return app.RunAsSubcommand(ctx) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command_test.go deleted file mode 100644 index 48caec7952..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/command_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package cli_test - -import ( - "flag" - "testing" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -func TestCommandDoNotIgnoreFlags(t *testing.T) { - app := cli.NewApp() - set := flag.NewFlagSet("test", 0) - test := []string{"blah", "blah", "-break"} - set.Parse(test) - - c := cli.NewContext(app, set, nil) - - command := cli.Command{ - Name: "test-cmd", - Aliases: []string{"tc"}, - Usage: "this is for testing", - Description: "testing", - Action: func(_ *cli.Context) {}, - } - err := command.Run(c) - - expect(t, err.Error(), "flag provided but not defined: -break") -} - -func TestCommandIgnoreFlags(t *testing.T) { - app := cli.NewApp() - set := flag.NewFlagSet("test", 0) - test := []string{"blah", "blah"} - set.Parse(test) - - c := cli.NewContext(app, set, nil) - - command := cli.Command{ - Name: "test-cmd", - Aliases: []string{"tc"}, - Usage: "this is for testing", - Description: "testing", - Action: func(_ *cli.Context) {}, - SkipFlagParsing: true, - } - err := command.Run(c) - - expect(t, err, nil) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context.go deleted file mode 100644 index f541f41c3c..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context.go +++ /dev/null @@ -1,388 +0,0 @@ -package cli - -import ( - "errors" - "flag" - "strconv" - "strings" - "time" -) - -// Context is a type that is passed through to -// each Handler action in a cli application. Context -// can be used to retrieve context-specific Args and -// parsed command-line options. -type Context struct { - App *App - Command Command - flagSet *flag.FlagSet - setFlags map[string]bool - globalSetFlags map[string]bool - parentContext *Context -} - -// Creates a new context. For use in when invoking an App or Command action. -func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { - return &Context{App: app, flagSet: set, parentContext: parentCtx} -} - -// Looks up the value of a local int flag, returns 0 if no int flag exists -func (c *Context) Int(name string) int { - return lookupInt(name, c.flagSet) -} - -// Looks up the value of a local time.Duration flag, returns 0 if no time.Duration flag exists -func (c *Context) Duration(name string) time.Duration { - return lookupDuration(name, c.flagSet) -} - -// Looks up the value of a local float64 flag, returns 0 if no float64 flag exists -func (c *Context) Float64(name string) float64 { - return lookupFloat64(name, c.flagSet) -} - -// Looks up the value of a local bool flag, returns false if no bool flag exists -func (c *Context) Bool(name string) bool { - return lookupBool(name, c.flagSet) -} - -// Looks up the value of a local boolT flag, returns false if no bool flag exists -func (c *Context) BoolT(name string) bool { - return lookupBoolT(name, c.flagSet) -} - -// Looks up the value of a local string flag, returns "" if no string flag exists -func (c *Context) String(name string) string { - return lookupString(name, c.flagSet) -} - -// Looks up the value of a local string slice flag, returns nil if no string slice flag exists -func (c *Context) StringSlice(name string) []string { - return lookupStringSlice(name, c.flagSet) -} - -// Looks up the value of a local int slice flag, returns nil if no int slice flag exists -func (c *Context) IntSlice(name string) []int { - return lookupIntSlice(name, c.flagSet) -} - -// Looks up the value of a local generic flag, returns nil if no generic flag exists -func (c *Context) Generic(name string) interface{} { - return lookupGeneric(name, c.flagSet) -} - -// Looks up the value of a global int flag, returns 0 if no int flag exists -func (c *Context) GlobalInt(name string) int { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupInt(name, fs) - } - return 0 -} - -// Looks up the value of a global time.Duration flag, returns 0 if no time.Duration flag exists -func (c *Context) GlobalDuration(name string) time.Duration { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupDuration(name, fs) - } - return 0 -} - -// Looks up the value of a global bool flag, returns false if no bool flag exists -func (c *Context) GlobalBool(name string) bool { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupBool(name, fs) - } - return false -} - -// Looks up the value of a global string flag, returns "" if no string flag exists -func (c *Context) GlobalString(name string) string { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupString(name, fs) - } - return "" -} - -// Looks up the value of a global string slice flag, returns nil if no string slice flag exists -func (c *Context) GlobalStringSlice(name string) []string { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupStringSlice(name, fs) - } - return nil -} - -// Looks up the value of a global int slice flag, returns nil if no int slice flag exists -func (c *Context) GlobalIntSlice(name string) []int { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupIntSlice(name, fs) - } - return nil -} - -// Looks up the value of a global generic flag, returns nil if no generic flag exists -func (c *Context) GlobalGeneric(name string) interface{} { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupGeneric(name, fs) - } - return nil -} - -// Returns the number of flags set -func (c *Context) NumFlags() int { - return c.flagSet.NFlag() -} - -// Determines if the flag was actually set -func (c *Context) IsSet(name string) bool { - if c.setFlags == nil { - c.setFlags = make(map[string]bool) - c.flagSet.Visit(func(f *flag.Flag) { - c.setFlags[f.Name] = true - }) - } - return c.setFlags[name] == true -} - -// Determines if the global flag was actually set -func (c *Context) GlobalIsSet(name string) bool { - if c.globalSetFlags == nil { - c.globalSetFlags = make(map[string]bool) - ctx := c - if ctx.parentContext != nil { - ctx = ctx.parentContext - } - for ; ctx != nil && c.globalSetFlags[name] == false; ctx = ctx.parentContext { - ctx.flagSet.Visit(func(f *flag.Flag) { - c.globalSetFlags[f.Name] = true - }) - } - } - return c.globalSetFlags[name] -} - -// Returns a slice of flag names used in this context. -func (c *Context) FlagNames() (names []string) { - for _, flag := range c.Command.Flags { - name := strings.Split(flag.getName(), ",")[0] - if name == "help" { - continue - } - names = append(names, name) - } - return -} - -// Returns a slice of global flag names used by the app. -func (c *Context) GlobalFlagNames() (names []string) { - for _, flag := range c.App.Flags { - name := strings.Split(flag.getName(), ",")[0] - if name == "help" || name == "version" { - continue - } - names = append(names, name) - } - return -} - -// Returns the parent context, if any -func (c *Context) Parent() *Context { - return c.parentContext -} - -type Args []string - -// Returns the command line arguments associated with the context. -func (c *Context) Args() Args { - args := Args(c.flagSet.Args()) - return args -} - -// Returns the nth argument, or else a blank string -func (a Args) Get(n int) string { - if len(a) > n { - return a[n] - } - return "" -} - -// Returns the first argument, or else a blank string -func (a Args) First() string { - return a.Get(0) -} - -// Return the rest of the arguments (not the first one) -// or else an empty string slice -func (a Args) Tail() []string { - if len(a) >= 2 { - return []string(a)[1:] - } - return []string{} -} - -// Checks if there are any arguments present -func (a Args) Present() bool { - return len(a) != 0 -} - -// Swaps arguments at the given indexes -func (a Args) Swap(from, to int) error { - if from >= len(a) || to >= len(a) { - return errors.New("index out of range") - } - a[from], a[to] = a[to], a[from] - return nil -} - -func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { - if ctx.parentContext != nil { - ctx = ctx.parentContext - } - for ; ctx != nil; ctx = ctx.parentContext { - if f := ctx.flagSet.Lookup(name); f != nil { - return ctx.flagSet - } - } - return nil -} - -func lookupInt(name string, set *flag.FlagSet) int { - f := set.Lookup(name) - if f != nil { - val, err := strconv.Atoi(f.Value.String()) - if err != nil { - return 0 - } - return val - } - - return 0 -} - -func lookupDuration(name string, set *flag.FlagSet) time.Duration { - f := set.Lookup(name) - if f != nil { - val, err := time.ParseDuration(f.Value.String()) - if err == nil { - return val - } - } - - return 0 -} - -func lookupFloat64(name string, set *flag.FlagSet) float64 { - f := set.Lookup(name) - if f != nil { - val, err := strconv.ParseFloat(f.Value.String(), 64) - if err != nil { - return 0 - } - return val - } - - return 0 -} - -func lookupString(name string, set *flag.FlagSet) string { - f := set.Lookup(name) - if f != nil { - return f.Value.String() - } - - return "" -} - -func lookupStringSlice(name string, set *flag.FlagSet) []string { - f := set.Lookup(name) - if f != nil { - return (f.Value.(*StringSlice)).Value() - - } - - return nil -} - -func lookupIntSlice(name string, set *flag.FlagSet) []int { - f := set.Lookup(name) - if f != nil { - return (f.Value.(*IntSlice)).Value() - - } - - return nil -} - -func lookupGeneric(name string, set *flag.FlagSet) interface{} { - f := set.Lookup(name) - if f != nil { - return f.Value - } - return nil -} - -func lookupBool(name string, set *flag.FlagSet) bool { - f := set.Lookup(name) - if f != nil { - val, err := strconv.ParseBool(f.Value.String()) - if err != nil { - return false - } - return val - } - - return false -} - -func lookupBoolT(name string, set *flag.FlagSet) bool { - f := set.Lookup(name) - if f != nil { - val, err := strconv.ParseBool(f.Value.String()) - if err != nil { - return true - } - return val - } - - return false -} - -func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { - switch ff.Value.(type) { - case *StringSlice: - default: - set.Set(name, ff.Value.String()) - } -} - -func normalizeFlags(flags []Flag, set *flag.FlagSet) error { - visited := make(map[string]bool) - set.Visit(func(f *flag.Flag) { - visited[f.Name] = true - }) - for _, f := range flags { - parts := strings.Split(f.getName(), ",") - if len(parts) == 1 { - continue - } - var ff *flag.Flag - for _, name := range parts { - name = strings.Trim(name, " ") - if visited[name] { - if ff != nil { - return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) - } - ff = set.Lookup(name) - } - } - if ff == nil { - continue - } - for _, name := range parts { - name = strings.Trim(name, " ") - if !visited[name] { - copyFlag(name, ff, set) - } - } - } - return nil -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context_test.go deleted file mode 100644 index bf17eca7b8..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/context_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package cli_test - -import ( - "flag" - "testing" - "time" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -func TestNewContext(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Int("myflag", 12, "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Int("myflag", 42, "doc") - globalCtx := cli.NewContext(nil, globalSet, nil) - command := cli.Command{Name: "mycommand"} - c := cli.NewContext(nil, set, globalCtx) - c.Command = command - expect(t, c.Int("myflag"), 12) - expect(t, c.GlobalInt("myflag"), 42) - expect(t, c.Command.Name, "mycommand") -} - -func TestContext_Int(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Int("myflag", 12, "doc") - c := cli.NewContext(nil, set, nil) - expect(t, c.Int("myflag"), 12) -} - -func TestContext_Duration(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Duration("myflag", time.Duration(12*time.Second), "doc") - c := cli.NewContext(nil, set, nil) - expect(t, c.Duration("myflag"), time.Duration(12*time.Second)) -} - -func TestContext_String(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.String("myflag", "hello world", "doc") - c := cli.NewContext(nil, set, nil) - expect(t, c.String("myflag"), "hello world") -} - -func TestContext_Bool(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - c := cli.NewContext(nil, set, nil) - expect(t, c.Bool("myflag"), false) -} - -func TestContext_BoolT(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", true, "doc") - c := cli.NewContext(nil, set, nil) - expect(t, c.BoolT("myflag"), true) -} - -func TestContext_Args(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - c := cli.NewContext(nil, set, nil) - set.Parse([]string{"--myflag", "bat", "baz"}) - expect(t, len(c.Args()), 2) - expect(t, c.Bool("myflag"), true) -} - -func TestContext_IsSet(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - globalCtx := cli.NewContext(nil, globalSet, nil) - c := cli.NewContext(nil, set, globalCtx) - set.Parse([]string{"--myflag", "bat", "baz"}) - globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) - expect(t, c.IsSet("myflag"), true) - expect(t, c.IsSet("otherflag"), false) - expect(t, c.IsSet("bogusflag"), false) - expect(t, c.IsSet("myflagGlobal"), false) -} - -func TestContext_GlobalIsSet(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - globalSet.Bool("myflagGlobalUnset", true, "doc") - globalCtx := cli.NewContext(nil, globalSet, nil) - c := cli.NewContext(nil, set, globalCtx) - set.Parse([]string{"--myflag", "bat", "baz"}) - globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) - expect(t, c.GlobalIsSet("myflag"), false) - expect(t, c.GlobalIsSet("otherflag"), false) - expect(t, c.GlobalIsSet("bogusflag"), false) - expect(t, c.GlobalIsSet("myflagGlobal"), true) - expect(t, c.GlobalIsSet("myflagGlobalUnset"), false) - expect(t, c.GlobalIsSet("bogusGlobal"), false) -} - -func TestContext_NumFlags(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - globalCtx := cli.NewContext(nil, globalSet, nil) - c := cli.NewContext(nil, set, globalCtx) - set.Parse([]string{"--myflag", "--otherflag=foo"}) - globalSet.Parse([]string{"--myflagGlobal"}) - expect(t, c.NumFlags(), 2) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag.go deleted file mode 100644 index 531b09130f..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag.go +++ /dev/null @@ -1,497 +0,0 @@ -package cli - -import ( - "flag" - "fmt" - "os" - "strconv" - "strings" - "time" -) - -// This flag enables bash-completion for all commands and subcommands -var BashCompletionFlag = BoolFlag{ - Name: "generate-bash-completion", -} - -// This flag prints the version for the application -var VersionFlag = BoolFlag{ - Name: "version, v", - Usage: "print the version", -} - -// This flag prints the help for all commands and subcommands -// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand -// unless HideHelp is set to true) -var HelpFlag = BoolFlag{ - Name: "help, h", - Usage: "show help", -} - -// Flag is a common interface related to parsing flags in cli. -// For more advanced flag parsing techniques, it is recomended that -// this interface be implemented. -type Flag interface { - fmt.Stringer - // Apply Flag settings to the given flag set - Apply(*flag.FlagSet) - getName() string -} - -func flagSet(name string, flags []Flag) *flag.FlagSet { - set := flag.NewFlagSet(name, flag.ContinueOnError) - - for _, f := range flags { - f.Apply(set) - } - return set -} - -func eachName(longName string, fn func(string)) { - parts := strings.Split(longName, ",") - for _, name := range parts { - name = strings.Trim(name, " ") - fn(name) - } -} - -// Generic is a generic parseable type identified by a specific flag -type Generic interface { - Set(value string) error - String() string -} - -// GenericFlag is the flag type for types implementing Generic -type GenericFlag struct { - Name string - Value Generic - Usage string - EnvVar string -} - -// String returns the string representation of the generic flag to display the -// help text to the user (uses the String() method of the generic flag to show -// the value) -func (f GenericFlag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s%s \"%v\"\t%v", prefixFor(f.Name), f.Name, f.Value, f.Usage)) -} - -// Apply takes the flagset and calls Set on the generic flag with the value -// provided by the user for parsing by the flag -func (f GenericFlag) Apply(set *flag.FlagSet) { - val := f.Value - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - val.Set(envVal) - break - } - } - } - - eachName(f.Name, func(name string) { - set.Var(f.Value, name, f.Usage) - }) -} - -func (f GenericFlag) getName() string { - return f.Name -} - -// StringSlice is an opaque type for []string to satisfy flag.Value -type StringSlice []string - -// Set appends the string value to the list of values -func (f *StringSlice) Set(value string) error { - *f = append(*f, value) - return nil -} - -// String returns a readable representation of this value (for usage defaults) -func (f *StringSlice) String() string { - return fmt.Sprintf("%s", *f) -} - -// Value returns the slice of strings set by this flag -func (f *StringSlice) Value() []string { - return *f -} - -// StringSlice is a string flag that can be specified multiple times on the -// command-line -type StringSliceFlag struct { - Name string - Value *StringSlice - Usage string - EnvVar string -} - -// String returns the usage -func (f StringSliceFlag) String() string { - firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ") - pref := prefixFor(firstName) - return withEnvHint(f.EnvVar, fmt.Sprintf("%s [%v]\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f StringSliceFlag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - newVal := &StringSlice{} - for _, s := range strings.Split(envVal, ",") { - s = strings.TrimSpace(s) - newVal.Set(s) - } - f.Value = newVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Value == nil { - f.Value = &StringSlice{} - } - set.Var(f.Value, name, f.Usage) - }) -} - -func (f StringSliceFlag) getName() string { - return f.Name -} - -// StringSlice is an opaque type for []int to satisfy flag.Value -type IntSlice []int - -// Set parses the value into an integer and appends it to the list of values -func (f *IntSlice) Set(value string) error { - tmp, err := strconv.Atoi(value) - if err != nil { - return err - } else { - *f = append(*f, tmp) - } - return nil -} - -// String returns a readable representation of this value (for usage defaults) -func (f *IntSlice) String() string { - return fmt.Sprintf("%d", *f) -} - -// Value returns the slice of ints set by this flag -func (f *IntSlice) Value() []int { - return *f -} - -// IntSliceFlag is an int flag that can be specified multiple times on the -// command-line -type IntSliceFlag struct { - Name string - Value *IntSlice - Usage string - EnvVar string -} - -// String returns the usage -func (f IntSliceFlag) String() string { - firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ") - pref := prefixFor(firstName) - return withEnvHint(f.EnvVar, fmt.Sprintf("%s [%v]\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f IntSliceFlag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - newVal := &IntSlice{} - for _, s := range strings.Split(envVal, ",") { - s = strings.TrimSpace(s) - err := newVal.Set(s) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - } - } - f.Value = newVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Value == nil { - f.Value = &IntSlice{} - } - set.Var(f.Value, name, f.Usage) - }) -} - -func (f IntSliceFlag) getName() string { - return f.Name -} - -// BoolFlag is a switch that defaults to false -type BoolFlag struct { - Name string - Usage string - EnvVar string -} - -// String returns a readable representation of this value (for usage defaults) -func (f BoolFlag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f BoolFlag) Apply(set *flag.FlagSet) { - val := false - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - envValBool, err := strconv.ParseBool(envVal) - if err == nil { - val = envValBool - } - break - } - } - } - - eachName(f.Name, func(name string) { - set.Bool(name, val, f.Usage) - }) -} - -func (f BoolFlag) getName() string { - return f.Name -} - -// BoolTFlag this represents a boolean flag that is true by default, but can -// still be set to false by --some-flag=false -type BoolTFlag struct { - Name string - Usage string - EnvVar string -} - -// String returns a readable representation of this value (for usage defaults) -func (f BoolTFlag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f BoolTFlag) Apply(set *flag.FlagSet) { - val := true - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - envValBool, err := strconv.ParseBool(envVal) - if err == nil { - val = envValBool - break - } - } - } - } - - eachName(f.Name, func(name string) { - set.Bool(name, val, f.Usage) - }) -} - -func (f BoolTFlag) getName() string { - return f.Name -} - -// StringFlag represents a flag that takes as string value -type StringFlag struct { - Name string - Value string - Usage string - EnvVar string -} - -// String returns the usage -func (f StringFlag) String() string { - var fmtString string - fmtString = "%s %v\t%v" - - if len(f.Value) > 0 { - fmtString = "%s \"%v\"\t%v" - } else { - fmtString = "%s %v\t%v" - } - - return withEnvHint(f.EnvVar, fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f StringFlag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - f.Value = envVal - break - } - } - } - - eachName(f.Name, func(name string) { - set.String(name, f.Value, f.Usage) - }) -} - -func (f StringFlag) getName() string { - return f.Name -} - -// IntFlag is a flag that takes an integer -// Errors if the value provided cannot be parsed -type IntFlag struct { - Name string - Value int - Usage string - EnvVar string -} - -// String returns the usage -func (f IntFlag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f IntFlag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - envValInt, err := strconv.ParseInt(envVal, 0, 64) - if err == nil { - f.Value = int(envValInt) - break - } - } - } - } - - eachName(f.Name, func(name string) { - set.Int(name, f.Value, f.Usage) - }) -} - -func (f IntFlag) getName() string { - return f.Name -} - -// DurationFlag is a flag that takes a duration specified in Go's duration -// format: https://golang.org/pkg/time/#ParseDuration -type DurationFlag struct { - Name string - Value time.Duration - Usage string - EnvVar string -} - -// String returns a readable representation of this value (for usage defaults) -func (f DurationFlag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f DurationFlag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - envValDuration, err := time.ParseDuration(envVal) - if err == nil { - f.Value = envValDuration - break - } - } - } - } - - eachName(f.Name, func(name string) { - set.Duration(name, f.Value, f.Usage) - }) -} - -func (f DurationFlag) getName() string { - return f.Name -} - -// Float64Flag is a flag that takes an float value -// Errors if the value provided cannot be parsed -type Float64Flag struct { - Name string - Value float64 - Usage string - EnvVar string -} - -// String returns the usage -func (f Float64Flag) String() string { - return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage)) -} - -// Apply populates the flag given the flag set and environment -func (f Float64Flag) Apply(set *flag.FlagSet) { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal := os.Getenv(envVar); envVal != "" { - envValFloat, err := strconv.ParseFloat(envVal, 10) - if err == nil { - f.Value = float64(envValFloat) - } - } - } - } - - eachName(f.Name, func(name string) { - set.Float64(name, f.Value, f.Usage) - }) -} - -func (f Float64Flag) getName() string { - return f.Name -} - -func prefixFor(name string) (prefix string) { - if len(name) == 1 { - prefix = "-" - } else { - prefix = "--" - } - - return -} - -func prefixedNames(fullName string) (prefixed string) { - parts := strings.Split(fullName, ",") - for i, name := range parts { - name = strings.Trim(name, " ") - prefixed += prefixFor(name) + name - if i < len(parts)-1 { - prefixed += ", " - } - } - return -} - -func withEnvHint(envVar, str string) string { - envText := "" - if envVar != "" { - envText = fmt.Sprintf(" [$%s]", strings.Join(strings.Split(envVar, ","), ", $")) - } - return str + envText -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag_test.go deleted file mode 100644 index f1f8e63086..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/flag_test.go +++ /dev/null @@ -1,742 +0,0 @@ -package cli_test - -import ( - "fmt" - "os" - "reflect" - "strings" - "testing" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -var boolFlagTests = []struct { - name string - expected string -}{ - {"help", "--help\t"}, - {"h", "-h\t"}, -} - -func TestBoolFlagHelpOutput(t *testing.T) { - - for _, test := range boolFlagTests { - flag := cli.BoolFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -var stringFlagTests = []struct { - name string - value string - expected string -}{ - {"help", "", "--help \t"}, - {"h", "", "-h \t"}, - {"h", "", "-h \t"}, - {"test", "Something", "--test \"Something\"\t"}, -} - -func TestStringFlagHelpOutput(t *testing.T) { - - for _, test := range stringFlagTests { - flag := cli.StringFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestStringFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_FOO", "derp") - for _, test := range stringFlagTests { - flag := cli.StringFlag{Name: test.name, Value: test.value, EnvVar: "APP_FOO"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_FOO]") { - t.Errorf("%s does not end with [$APP_FOO]", output) - } - } -} - -var stringSliceFlagTests = []struct { - name string - value *cli.StringSlice - expected string -}{ - {"help", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "--help [--help option --help option]\t"}, - {"h", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "-h [-h option -h option]\t"}, - {"h", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "-h [-h option -h option]\t"}, - {"test", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("Something") - return s - }(), "--test [--test option --test option]\t"}, -} - -func TestStringSliceFlagHelpOutput(t *testing.T) { - - for _, test := range stringSliceFlagTests { - flag := cli.StringSliceFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestStringSliceFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_QWWX", "11,4") - for _, test := range stringSliceFlagTests { - flag := cli.StringSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_QWWX"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_QWWX]") { - t.Errorf("%q does not end with [$APP_QWWX]", output) - } - } -} - -var intFlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestIntFlagHelpOutput(t *testing.T) { - - for _, test := range intFlagTests { - flag := cli.IntFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestIntFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAR", "2") - for _, test := range intFlagTests { - flag := cli.IntFlag{Name: test.name, EnvVar: "APP_BAR"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAR]") { - t.Errorf("%s does not end with [$APP_BAR]", output) - } - } -} - -var durationFlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestDurationFlagHelpOutput(t *testing.T) { - - for _, test := range durationFlagTests { - flag := cli.DurationFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestDurationFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAR", "2h3m6s") - for _, test := range durationFlagTests { - flag := cli.DurationFlag{Name: test.name, EnvVar: "APP_BAR"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAR]") { - t.Errorf("%s does not end with [$APP_BAR]", output) - } - } -} - -var intSliceFlagTests = []struct { - name string - value *cli.IntSlice - expected string -}{ - {"help", &cli.IntSlice{}, "--help [--help option --help option]\t"}, - {"h", &cli.IntSlice{}, "-h [-h option -h option]\t"}, - {"h", &cli.IntSlice{}, "-h [-h option -h option]\t"}, - {"test", func() *cli.IntSlice { - i := &cli.IntSlice{} - i.Set("9") - return i - }(), "--test [--test option --test option]\t"}, -} - -func TestIntSliceFlagHelpOutput(t *testing.T) { - - for _, test := range intSliceFlagTests { - flag := cli.IntSliceFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestIntSliceFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_SMURF", "42,3") - for _, test := range intSliceFlagTests { - flag := cli.IntSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_SMURF"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_SMURF]") { - t.Errorf("%q does not end with [$APP_SMURF]", output) - } - } -} - -var float64FlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestFloat64FlagHelpOutput(t *testing.T) { - - for _, test := range float64FlagTests { - flag := cli.Float64Flag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestFloat64FlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAZ", "99.4") - for _, test := range float64FlagTests { - flag := cli.Float64Flag{Name: test.name, EnvVar: "APP_BAZ"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAZ]") { - t.Errorf("%s does not end with [$APP_BAZ]", output) - } - } -} - -var genericFlagTests = []struct { - name string - value cli.Generic - expected string -}{ - {"test", &Parser{"abc", "def"}, "--test \"abc,def\"\ttest flag"}, - {"t", &Parser{"abc", "def"}, "-t \"abc,def\"\ttest flag"}, -} - -func TestGenericFlagHelpOutput(t *testing.T) { - - for _, test := range genericFlagTests { - flag := cli.GenericFlag{Name: test.name, Value: test.value, Usage: "test flag"} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestGenericFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_ZAP", "3") - for _, test := range genericFlagTests { - flag := cli.GenericFlag{Name: test.name, EnvVar: "APP_ZAP"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_ZAP]") { - t.Errorf("%s does not end with [$APP_ZAP]", output) - } - } -} - -func TestParseMultiString(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("serve") != "10" { - t.Errorf("main name not set") - } - if ctx.String("s") != "10" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10"}) -} - -func TestParseMultiStringFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_COUNT", "20") - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "count, c", EnvVar: "APP_COUNT"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("count") != "20" { - t.Errorf("main name not set") - } - if ctx.String("c") != "20" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_COUNT", "20") - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "count, c", EnvVar: "COMPAT_COUNT,APP_COUNT"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("count") != "20" { - t.Errorf("main name not set") - } - if ctx.String("c") != "20" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringSlice(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10", "-s", "20"}) -} - -func TestParseMultiStringSliceFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringSliceFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiInt(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("serve") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("s") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10"}) -} - -func TestParseMultiIntFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "10") - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("timeout") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("t") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiIntFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "10") - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("timeout") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("t") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiIntSlice(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "serve, s", Value: &cli.IntSlice{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("serve"), []int{10, 20}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.IntSlice("s"), []int{10, 20}) { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10", "-s", "20"}) -} - -func TestParseMultiIntSliceFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiIntSliceFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiFloat64(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("serve") != 10.2 { - t.Errorf("main name not set") - } - if ctx.Float64("s") != 10.2 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10.2"}) -} - -func TestParseMultiFloat64FromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "15.5") - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("timeout") != 15.5 { - t.Errorf("main name not set") - } - if ctx.Float64("t") != 15.5 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiFloat64FromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "15.5") - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("timeout") != 15.5 { - t.Errorf("main name not set") - } - if ctx.Float64("t") != 15.5 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBool(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("serve") != true { - t.Errorf("main name not set") - } - if ctx.Bool("s") != true { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "--serve"}) -} - -func TestParseMultiBoolFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "1") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("debug") != true { - t.Errorf("main name not set from env") - } - if ctx.Bool("d") != true { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "1") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("debug") != true { - t.Errorf("main name not set from env") - } - if ctx.Bool("d") != true { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolT(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("serve") != true { - t.Errorf("main name not set") - } - if ctx.BoolT("s") != true { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "--serve"}) -} - -func TestParseMultiBoolTFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "0") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("debug") != false { - t.Errorf("main name not set from env") - } - if ctx.BoolT("d") != false { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolTFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "0") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("debug") != false { - t.Errorf("main name not set from env") - } - if ctx.BoolT("d") != false { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -type Parser [2]string - -func (p *Parser) Set(value string) error { - parts := strings.Split(value, ",") - if len(parts) != 2 { - return fmt.Errorf("invalid format") - } - - (*p)[0] = parts[0] - (*p)[1] = parts[1] - - return nil -} - -func (p *Parser) String() string { - return fmt.Sprintf("%s,%s", p[0], p[1]) -} - -func TestParseGeneric(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "serve, s", Value: &Parser{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"10", "20"}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"10", "20"}) { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10,20"}) -} - -func TestParseGenericFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_SERVE", "20,30") - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "serve, s", Value: &Parser{}, EnvVar: "APP_SERVE"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"20", "30"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"20", "30"}) { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseGenericFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_FOO", "99,2000") - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "foos", Value: &Parser{}, EnvVar: "COMPAT_FOO,APP_FOO"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("foos"), &Parser{"99", "2000"}) { - t.Errorf("value not set from env") - } - }, - } - a.Run([]string{"run"}) -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help.go deleted file mode 100644 index 66ef2fb781..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help.go +++ /dev/null @@ -1,238 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "strings" - "text/tabwriter" - "text/template" -) - -// The text template for the Default help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var AppHelpTemplate = `NAME: - {{.Name}} - {{.Usage}} - -USAGE: - {{.Name}} {{if .Flags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} [arguments...] - {{if .Version}} -VERSION: - {{.Version}} - {{end}}{{if len .Authors}} -AUTHOR(S): - {{range .Authors}}{{ . }}{{end}} - {{end}}{{if .Commands}} -COMMANDS: - {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} - {{end}}{{end}}{{if .Flags}} -GLOBAL OPTIONS: - {{range .Flags}}{{.}} - {{end}}{{end}}{{if .Copyright }} -COPYRIGHT: - {{.Copyright}} - {{end}} -` - -// The text template for the command help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var CommandHelpTemplate = `NAME: - {{.FullName}} - {{.Usage}} - -USAGE: - command {{.FullName}}{{if .Flags}} [command options]{{end}} [arguments...]{{if .Description}} - -DESCRIPTION: - {{.Description}}{{end}}{{if .Flags}} - -OPTIONS: - {{range .Flags}}{{.}} - {{end}}{{ end }} -` - -// The text template for the subcommand help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var SubcommandHelpTemplate = `NAME: - {{.Name}} - {{.Usage}} - -USAGE: - {{.Name}} command{{if .Flags}} [command options]{{end}} [arguments...] - -COMMANDS: - {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} - {{end}}{{if .Flags}} -OPTIONS: - {{range .Flags}}{{.}} - {{end}}{{end}} -` - -var helpCommand = Command{ - Name: "help", - Aliases: []string{"h"}, - Usage: "Shows a list of commands or help for one command", - Action: func(c *Context) { - args := c.Args() - if args.Present() { - ShowCommandHelp(c, args.First()) - } else { - ShowAppHelp(c) - } - }, -} - -var helpSubcommand = Command{ - Name: "help", - Aliases: []string{"h"}, - Usage: "Shows a list of commands or help for one command", - Action: func(c *Context) { - args := c.Args() - if args.Present() { - ShowCommandHelp(c, args.First()) - } else { - ShowSubcommandHelp(c) - } - }, -} - -// Prints help for the App or Command -type helpPrinter func(w io.Writer, templ string, data interface{}) - -var HelpPrinter helpPrinter = printHelp - -// Prints version for the App -var VersionPrinter = printVersion - -func ShowAppHelp(c *Context) { - HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) -} - -// Prints the list of subcommands as the default app completion method -func DefaultAppComplete(c *Context) { - for _, command := range c.App.Commands { - for _, name := range command.Names() { - fmt.Fprintln(c.App.Writer, name) - } - } -} - -// Prints help for the given command -func ShowCommandHelp(ctx *Context, command string) { - // show the subcommand help for a command with subcommands - if command == "" { - HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) - return - } - - for _, c := range ctx.App.Commands { - if c.HasName(command) { - HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) - return - } - } - - if ctx.App.CommandNotFound != nil { - ctx.App.CommandNotFound(ctx, command) - } else { - fmt.Fprintf(ctx.App.Writer, "No help topic for '%v'\n", command) - } -} - -// Prints help for the given subcommand -func ShowSubcommandHelp(c *Context) { - ShowCommandHelp(c, c.Command.Name) -} - -// Prints the version number of the App -func ShowVersion(c *Context) { - VersionPrinter(c) -} - -func printVersion(c *Context) { - fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) -} - -// Prints the lists of commands within a given context -func ShowCompletions(c *Context) { - a := c.App - if a != nil && a.BashComplete != nil { - a.BashComplete(c) - } -} - -// Prints the custom completions for a given command -func ShowCommandCompletions(ctx *Context, command string) { - c := ctx.App.Command(command) - if c != nil && c.BashComplete != nil { - c.BashComplete(ctx) - } -} - -func printHelp(out io.Writer, templ string, data interface{}) { - funcMap := template.FuncMap{ - "join": strings.Join, - } - - w := tabwriter.NewWriter(out, 0, 8, 1, '\t', 0) - t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) - err := t.Execute(w, data) - if err != nil { - panic(err) - } - w.Flush() -} - -func checkVersion(c *Context) bool { - if c.GlobalBool("version") || c.GlobalBool("v") || c.Bool("version") || c.Bool("v") { - ShowVersion(c) - return true - } - - return false -} - -func checkHelp(c *Context) bool { - if c.GlobalBool("h") || c.GlobalBool("help") || c.Bool("h") || c.Bool("help") { - ShowAppHelp(c) - return true - } - - return false -} - -func checkCommandHelp(c *Context, name string) bool { - if c.Bool("h") || c.Bool("help") { - ShowCommandHelp(c, name) - return true - } - - return false -} - -func checkSubcommandHelp(c *Context) bool { - if c.GlobalBool("h") || c.GlobalBool("help") { - ShowSubcommandHelp(c) - return true - } - - return false -} - -func checkCompletions(c *Context) bool { - if (c.GlobalBool(BashCompletionFlag.Name) || c.Bool(BashCompletionFlag.Name)) && c.App.EnableBashCompletion { - ShowCompletions(c) - return true - } - - return false -} - -func checkCommandCompletions(c *Context, name string) bool { - if c.Bool(BashCompletionFlag.Name) && c.App.EnableBashCompletion { - ShowCommandCompletions(c, name) - return true - } - - return false -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help_test.go deleted file mode 100644 index 5edbf347d9..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/help_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package cli_test - -import ( - "bytes" - "testing" - - "github.com/moul/anonuuid/vendor/github.com/codegangsta/cli" -) - -func Test_ShowAppHelp_NoAuthor(t *testing.T) { - output := new(bytes.Buffer) - app := cli.NewApp() - app.Writer = output - - c := cli.NewContext(app, nil, nil) - - cli.ShowAppHelp(c) - - if bytes.Index(output.Bytes(), []byte("AUTHOR(S):")) != -1 { - t.Errorf("expected\n%snot to include %s", output.String(), "AUTHOR(S):") - } -} - -func Test_ShowAppHelp_NoVersion(t *testing.T) { - output := new(bytes.Buffer) - app := cli.NewApp() - app.Writer = output - - app.Version = "" - - c := cli.NewContext(app, nil, nil) - - cli.ShowAppHelp(c) - - if bytes.Index(output.Bytes(), []byte("VERSION:")) != -1 { - t.Errorf("expected\n%snot to include %s", output.String(), "VERSION:") - } -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/helpers_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/helpers_test.go deleted file mode 100644 index cdc4feb2fc..0000000000 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/codegangsta/cli/helpers_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package cli_test - -import ( - "reflect" - "testing" -) - -/* Test Helpers */ -func expect(t *testing.T, a interface{}, b interface{}) { - if a != b { - t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} - -func refute(t *testing.T, a interface{}, b interface{}) { - if a == b { - t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/collections.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/collections.go index bb9580cb10..7160dce05e 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/collections.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/collections.go @@ -4,7 +4,7 @@ import ( "fmt" "reflect" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) // ShouldContain receives exactly two parameters. The first is a slice and the diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/equality.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/equality.go index ec89cff2c7..78145e7984 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/equality.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/equality.go @@ -7,7 +7,7 @@ import ( "reflect" "strings" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) // default acceptable delta for ShouldAlmostEqual diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/all_of_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/all_of_test.go index 4b48bd71b4..9cf68817d7 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/all_of_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/all_of_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of_test.go index 1b4220f0cd..12df36b646 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of_test.go @@ -18,8 +18,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_test.go index 643be66d76..f4d5c574b8 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_test.go @@ -16,8 +16,8 @@ package oglematchers_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains_test.go index da9ff8a252..7562f74f31 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains_test.go @@ -16,8 +16,8 @@ package oglematchers_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals_test.go index bcdc9116f5..d6367e4608 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "bytes" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "testing" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/elements_are_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/elements_are_test.go index 9758110ca7..7a545efc54 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/elements_are_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/elements_are_test.go @@ -16,8 +16,8 @@ package oglematchers_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals_test.go index d8df670547..2e4a527282 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals_test.go @@ -20,8 +20,8 @@ import ( "math" "unsafe" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) var someInt int = -17 diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/error_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/error_test.go index 9de0f51f9c..636f3a0a29 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/error_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/error_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal_test.go index fd48b860a9..d8aa662aa5 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal_test.go @@ -18,8 +18,8 @@ package oglematchers_test import ( "math" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than_test.go index 49f8c908eb..ee8546ecc9 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than_test.go @@ -18,8 +18,8 @@ package oglematchers_test import ( "math" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_same_type_as_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_same_type_as_test.go index af0dab40ca..8af0bde268 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_same_type_as_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_same_type_as_test.go @@ -19,8 +19,8 @@ import ( "io" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) func TestHasSameTypeAs(t *testing.T) { RunTests(t) } diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_substr_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_substr_test.go index 3c9b95c1df..aed981106e 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_substr_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/has_substr_test.go @@ -16,8 +16,8 @@ package oglematchers_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/identical_to_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/identical_to_test.go index 0e951bcb29..b693d12022 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/identical_to_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/identical_to_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "fmt" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "io" "unsafe" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal_test.go index 98c3e85307..28bc104aeb 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal_test.go @@ -18,8 +18,8 @@ package oglematchers_test import ( "math" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than_test.go index e59aee43e0..a9318adc7c 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than_test.go @@ -18,8 +18,8 @@ package oglematchers_test import ( "math" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/matches_regexp_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/matches_regexp_test.go index 3b8de26f3e..1c83895b25 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/matches_regexp_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/matches_regexp_test.go @@ -16,8 +16,8 @@ package oglematchers_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/not_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/not_test.go index 9788876267..5b7b604a82 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/not_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/not_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "testing" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/panics_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/panics_test.go index 3a038524c0..537528cbce 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/panics_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/panics_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/pointee_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/pointee_test.go index 07339f0fae..f59956b9bd 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/pointee_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers/pointee_test.go @@ -17,8 +17,8 @@ package oglematchers_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "testing" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/controller_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/controller_test.go index 04c3f83cee..3f8c4e4785 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/controller_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/controller_test.go @@ -16,9 +16,9 @@ package oglemock_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "reflect" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/do_all_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/do_all_test.go index c29ec9cd53..087abd722a 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/do_all_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/do_all_test.go @@ -19,9 +19,9 @@ import ( "reflect" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) func TestDoAll(t *testing.T) { RunTests(t) } diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/integration_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/integration_test.go index d613c752af..d8681f1f39 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/integration_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/integration_test.go @@ -17,10 +17,10 @@ package oglemock_test import ( "errors" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "path" "runtime" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation.go index 13ffa2ddf6..0d11a34744 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation.go @@ -18,7 +18,7 @@ package oglemock import ( "errors" "fmt" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" "reflect" "sync" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation_test.go index e2b55320d5..98f535525a 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/internal_expectation_test.go @@ -16,9 +16,9 @@ package oglemock_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "reflect" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/invoke_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/invoke_test.go index 7ad5667797..772472c163 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/invoke_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/invoke_test.go @@ -16,9 +16,9 @@ package oglemock_test import ( - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "reflect" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/return_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/return_test.go index 1312c19270..34d8434fd6 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/return_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/return_test.go @@ -17,9 +17,9 @@ package oglemock_test import ( "bytes" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" "io" "math" "reflect" diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io/mock_io.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io/mock_io.go index 7617c9af15..b12a450066 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io/mock_io.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/sample/mock_io/mock_io.go @@ -8,7 +8,7 @@ package mock_io import ( fmt "fmt" - oglemock "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + oglemock "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" io "io" runtime "runtime" unsafe "unsafe" diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/save_arg_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/save_arg_test.go index cf554500ce..c73464180e 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/save_arg_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock/save_arg_test.go @@ -21,9 +21,9 @@ import ( "reflect" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" ) func TestSaveArg(t *testing.T) { RunTests(t) } diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_aliases.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_aliases.go index 38f9989ac0..9d9dfa5148 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_aliases.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_aliases.go @@ -16,7 +16,7 @@ package ogletest import ( - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) // AssertEq(e, a) is equivalent to AssertThat(a, oglematchers.Equals(e)). diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_that.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_that.go index 1ce5acc73c..7215176b36 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_that.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/assert_that.go @@ -16,7 +16,7 @@ package ogletest import ( - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) func assertThat( diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_aliases.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_aliases.go index a3f51f22a5..2bbdac3428 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_aliases.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_aliases.go @@ -15,7 +15,7 @@ package ogletest -import "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" +import "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" // ExpectEq(e, a) is equivalent to ExpectThat(a, oglematchers.Equals(e)). func ExpectEq(expected, actual interface{}, errorParts ...interface{}) { diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_call.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_call.go index 492e3dc418..0438a76589 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_call.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_call.go @@ -16,7 +16,7 @@ package ogletest import ( - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" "runtime" ) diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that.go index 99fce748de..90b6d8e0f3 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that.go @@ -21,7 +21,7 @@ import ( "reflect" "runtime" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) // ExpectThat confirms that the supplied matcher matches the value x, adding a diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that_test.go index 9124b34268..6698323faa 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/expect_that_test.go @@ -19,7 +19,7 @@ import ( "errors" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) //////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/register_test_suite.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/register_test_suite.go index 353b914c58..05c0449a64 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/register_test_suite.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/register_test_suite.go @@ -19,7 +19,7 @@ import ( "fmt" "reflect" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil" ) // Test suites that implement this interface have special meaning to diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/run_tests.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/run_tests.go index a780a9acf9..a864227b86 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/run_tests.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/run_tests.go @@ -28,7 +28,7 @@ import ( "testing" "time" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace" ) var fTestFilter = flag.String( diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil/methods_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil/methods_test.go index 45dc5bc83c..8c4f8cd70e 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil/methods_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil/methods_test.go @@ -20,9 +20,9 @@ import ( "reflect" "testing" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" - . "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + . "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/srcutil" ) func TestRegisterMethodsTest(t *testing.T) { RunTests(t) } diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/test_info.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/test_info.go index 8702309401..4470a4bb4f 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/test_info.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/ogletest/test_info.go @@ -18,9 +18,9 @@ package ogletest import ( "sync" - "github.com/moul/anonuuid/vendor/golang.org/x/net/context" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglemock" ) // TestInfo represents information about a currently running or previously-run diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace/reqtrace.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace/reqtrace.go index bcc714a068..c20a38de90 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace/reqtrace.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/reqtrace/reqtrace.go @@ -18,7 +18,7 @@ package reqtrace import ( "flag" - "github.com/moul/anonuuid/vendor/golang.org/x/net/context" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context" ) type contextKey int diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/quantity.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/quantity.go index b0355d24c8..387bd4941c 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/quantity.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/quantity.go @@ -3,7 +3,7 @@ package assertions import ( "fmt" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/internal/oglematchers" ) // ShouldBeGreaterThan receives exactly two parameters and ensures that the first is greater than the second. diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer.go index 53b3c54542..1caa37c14a 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) type Serializer interface { diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer_test.go index ecd9c33319..7b8af7aaae 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions/serializer_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) func TestSerializerCreatesSerializedVersionOfAssertionResult(t *testing.T) { diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/assertions.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/assertions.go index f949de5c6a..b35afac488 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/assertions.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/assertions.go @@ -1,6 +1,6 @@ package convey -import "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions" +import "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions" var ( ShouldEqual = assertions.ShouldEqual diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/context.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/context.go index b452ca01ea..e51b026f7d 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/context.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/context.go @@ -3,8 +3,8 @@ package convey import ( "fmt" - "github.com/moul/anonuuid/vendor/github.com/jtolds/gls" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/jtolds/gls" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) type conveyErr struct { diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/doc.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/doc.go index 549ccd0239..f2e5f7c678 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/doc.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/doc.go @@ -3,7 +3,7 @@ // packages from this project as they serve internal purposes. package convey -import "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" +import "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ////////////////////////////////// suite ////////////////////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/init.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/init.go index d7ad3e1a7c..24bb85d370 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/init.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/init.go @@ -4,9 +4,9 @@ import ( "flag" "os" - "github.com/moul/anonuuid/vendor/github.com/jtolds/gls" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/jtolds/gls" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/assertions" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) func init() { diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go index 4d241be623..2726c5b321 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go @@ -1,7 +1,7 @@ package convey import ( - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) type nilReporter struct{} diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go index 6dd2276b82..0f181f399f 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go @@ -6,7 +6,7 @@ import ( "runtime" "strings" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/gotest" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/gotest" ) ////////////////// ScopeReport //////////////////// diff --git a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting_hooks_test.go b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting_hooks_test.go index 6ced1dd287..bf44204db2 100644 --- a/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting_hooks_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting_hooks_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/github.com/smartystreets/goconvey/convey/reporting" ) func TestSingleScopeReported(t *testing.T) { diff --git a/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/context.go b/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/context.go index 430d4fa332..7c1116cd84 100644 --- a/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/context.go +++ b/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/context.go @@ -34,7 +34,7 @@ // // See http://blog.golang.org/context for example code for a server that uses // Contexts. -package context // import "github.com/moul/anonuuid/vendor/golang.org/x/net/context" +package context // import "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context" import ( "errors" diff --git a/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/withtimeout_test.go b/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/withtimeout_test.go index 780e727869..6055a1fa7b 100644 --- a/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/withtimeout_test.go +++ b/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context/withtimeout_test.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "github.com/moul/anonuuid/vendor/golang.org/x/net/context" + "github.com/scaleway/scaleway-cli/vendor/github.com/moul/anonuuid/vendor/golang.org/x/net/context" ) func ExampleWithTimeout() { diff --git a/vendor/github.com/moul/gotty-client/LICENSE b/vendor/github.com/moul/gotty-client/LICENSE new file mode 100644 index 0000000000..492e2c629a --- /dev/null +++ b/vendor/github.com/moul/gotty-client/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Manfred Touron + +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/moul/gotty-client/Makefile b/vendor/github.com/moul/gotty-client/Makefile new file mode 100644 index 0000000000..cded47b7e5 --- /dev/null +++ b/vendor/github.com/moul/gotty-client/Makefile @@ -0,0 +1,66 @@ +COMMANDS := $(addprefix ./,$(wildcard cmd/*)) +PACKAGES := . +VERSION := $(shell cat .goxc.json | jq -c .PackageVersion | sed 's/"//g') +SOURCES := $(shell find . -name "*.go") +GOTTY_URL := http://localhost:8081/ + + +.PHONY: build +build: $(notdir $(COMMANDS)) + + +.PHONY: test +test: build + ./gotty-client $(GOTTY_URL) + + +.PHONY: build-docker +build-docker: contrib/docker/.docker-container-built + + +.PHONY: clean +clean: + rm -f $(notdir $(COMMANDS)) + + +.PHONY: install +install: + go install $(COMMANDS) + + +.PHONY: release +release: + goxc + + +.PHONY: build-docker +build-docker: contrib/docker/.docker-container-built + + +.PHONY: run-docker +run-docker: build-docker + docker run -it --rm moul/gotty-client $(GOTTY_URL) + + +$(notdir $(COMMANDS)): $(SOURCES) + gofmt -w $(PACKAGES) ./cmd/$@ + go test -i $(PACKAGES) ./cmd/$@ + go build -o $@ ./cmd/$@ + ./$@ --version + + +dist/latest/gotty-client_latest_linux_386: $(SOURCES) + mkdir -p dist + rm -f dist/latest + (cd dist; ln -s $(VERSION) latest) + goxc -bc="linux,386" xc + cp dist/latest/gotty-client_$(VERSION)_linux_386 dist/latest/gotty-client_latest_linux_386 + + +contrib/docker/.docker-container-built: dist/latest/gotty-client_latest_linux_386 + cp dist/latest/gotty-client_latest_linux_386 contrib/docker/gotty-client + docker build -t moul/gotty-client:latest contrib/docker + docker tag moul/gotty-client:latest moul/gotty-client:$(VERSION) + docker run -it --rm moul/gotty-client --version + docker inspect --type=image --format="{{ .Id }}" moul/gotty-client > $@.tmp + mv $@.tmp $@ diff --git a/vendor/github.com/moul/gotty-client/README.md b/vendor/github.com/moul/gotty-client/README.md new file mode 100644 index 0000000000..7a1723cb3d --- /dev/null +++ b/vendor/github.com/moul/gotty-client/README.md @@ -0,0 +1,146 @@ +# gotty-client +:wrench: [GoTTY](https://github.com/yudai/gotty) client for your terminal + +![](https://raw.githubusercontent.com/moul/gotty-client/master/resources/gotty-client.png) + +[![Build Status](https://travis-ci.org/moul/gotty-client.svg?branch=master)](https://travis-ci.org/moul/gotty-client) +[![GoDoc](https://godoc.org/github.com/moul/gotty-client?status.svg)](https://godoc.org/github.com/moul/gotty-client) + +```ruby + +----------------+ +----------------+ +-------------+ + | | | +---------> /bin/bash | + +---> Browser -----+ | gotty | | +-------------+ ++-------+ | | | | | | | +| | | +----------------+ | | | | +-------------+ +| Bob +---+ +--->---websockets+---------> /bin/bash | +| | | +================+ | | | | +-------------+ ++-------+ | |................| | | | | + +--->..gotty-client.-----+ | | | +-------------+ + |................| | +---------> /bin/bash | + +================+ +----------------+ +-------------+ + + ^ ^ ^ ^ ^ + | | | | | +``` + +## Example + +Server side ([GoTTY](https://github.com/yudai/gotty)) + +```console +$ gotty -p 9191 sh -c 'while true; do date; sleep 1; done' +2015/08/24 18:54:31 Server is starting with command: sh -c while true; do date; sleep 1; done +2015/08/24 18:54:31 URL: http://[::1]:9191/ +2015/08/24 18:54:34 GET /ws +2015/08/24 18:54:34 New client connected: 127.0.0.1:61811 +2015/08/24 18:54:34 Command is running for client 127.0.0.1:61811 with PID 64834 +2015/08/24 18:54:39 Command exited for: 127.0.0.1:61811 +2015/08/24 18:54:39 Connection closed: 127.0.0.1:61811 +... +``` + +**Client side** + +```console +$ gotty-client http://localhost:9191/ +INFO[0000] New title: GoTTY - sh -c while true; do date; sleep 1; done (jean-michel-van-damme.local) +WARN[0000] Unhandled protocol message: json pref: 2{} +Mon Aug 24 18:54:34 CEST 2015 +Mon Aug 24 18:54:35 CEST 2015 +Mon Aug 24 18:54:36 CEST 2015 +Mon Aug 24 18:54:37 CEST 2015 +Mon Aug 24 18:54:38 CEST 2015 +^C +``` + +## Usage + +```console +$ gotty-client -h +NAME: + gotty-client - GoTTY client for your terminal + +USAGE: + gotty-client [global options] command [command options] GOTTY_URL + +VERSION: + 1.1.0 + +AUTHOR(S): + Manfred Touron + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +## Install + +Install latest version using Golang (recommended) + +```console +$ go get github.com/moul/gotty-client/cmd/gotty-client +``` + +--- + +Install latest version using Homebrew (Mac OS X) + +```console +$ brew install https://raw.githubusercontent.com/moul/gotty-client/master/contrib/homebrew/gotty-client.rb --HEAD +``` + +or the latest released version + +```console +$ brew install https://raw.githubusercontent.com/moul/ssh2docker/master/contrib/homebrew/assh.rb +``` + +## Changelog + +### master (unreleased) + +* Add debug mode (`--debug`/`-D`) ([#18](https://github.com/moul/gotty-client/issues/18)) +* Improve error message when connecting by checking HTTP status code +* Fix arguments passing ([#16](https://github.com/moul/gotty-client/issues/16)) + +[full commits list](https://github.com/moul/gotty-client/compare/v1.1.0...master) + +### [v1.1.0](https://github.com/moul/gotty-client/releases/tag/v1.1.0) (2015-10-10) + +* Handling arguments + using mutexes (thanks to [@QuentinPerez](https://github.com/QuentinPerez)) +* Add logo ([#9](https://github.com/moul/gotty-client/issues/9)) +* Using codegansta/cli for CLI parsing ([#3](https://github.com/moul/gotty-client/issues/3)) +* Fix panic when running on older GoTTY server ([#13](https://github.com/moul/gotty-client/issues/13)) +* Add 'homebrew support' ([#1](https://github.com/moul/gotty-client/issues/1)) +* Add Changelog ([#5](https://github.com/moul/gotty-client/issues/5)) +* Add GOXC configuration to build binaries for multiple architectures ([#2](https://github.com/moul/gotty-client/issues/2)) + +[full commits list](https://github.com/moul/gotty-client/compare/v1.0.1...v1.1.0) + +### [v1.0.1](https://github.com/moul/gotty-client/releases/tag/v1.0.1) (2015-09-27) + +* Using party to manage dependencies + +[full commits list](https://github.com/moul/gotty-client/compare/v1.0.0...v1.0.1) + +### [v1.0.0](https://github.com/moul/gotty-client/releases/tag/v1.0.0) (2015-09-27) + +Compatible with [GoTTY](https://github.com/yudai/gotty) version: [v0.0.10](https://github.com/yudai/gotty/releases/tag/v0.0.10) + +#### Features + +* Support **basic-auth** +* Support **terminal-(re)size** +* Support **write** +* Support **title** +* Support **custom URI** + +[full commits list](https://github.com/moul/gotty-client/compare/cf0c1146c7ce20fe0bd65764c13253bc575cd43a...v1.0.0) + +## License + +MIT diff --git a/vendor/github.com/moul/gotty-client/gotty-client b/vendor/github.com/moul/gotty-client/gotty-client new file mode 100755 index 0000000000000000000000000000000000000000..a0887d844aa28a9912d91ba2fe0310ca693f3367 GIT binary patch literal 8614540 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 z%0DDTvepX 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