]> git.apps.os.sepia.ceph.com Git - fscrypt.git/commitdiff
vendor: add in external packages for use with CLI
authorJoe Richey joerichey@google.com <joerichey@google.com>
Wed, 24 May 2017 02:12:26 +0000 (19:12 -0700)
committerJoe Richey joerichey@google.com <joerichey@google.com>
Wed, 31 May 2017 20:54:10 +0000 (13:54 -0700)
crypto/ssh/terminal gets us information about the terminal, such as
its dimensions and state. It also allows us to manipulate the terminal.
For example, we can put the terminal in raw mode when a passphrase needs
to be entered.

This commit also add the github.com/urfave/cli package which we will use
to write the command line tool component of fscrypt. This tool allows
for us to easily use commands and subcommands.

Note that this is actually the upstream repository with two PRs applied:

https://github.com/urfave/cli/pull/629
https://github.com/urfave/cli/pull/630

They fix bugs in the handling of custom usage errors.

Change-Id: I2d3ba967b1bce8f73440e3a06df4eaba7ab96c19

25 files changed:
vendor/github.com/urfave/cli/CHANGELOG.md [new file with mode: 0644]
vendor/github.com/urfave/cli/LICENSE [new file with mode: 0644]
vendor/github.com/urfave/cli/README.md [new file with mode: 0644]
vendor/github.com/urfave/cli/app.go [new file with mode: 0644]
vendor/github.com/urfave/cli/appveyor.yml [new file with mode: 0644]
vendor/github.com/urfave/cli/category.go [new file with mode: 0644]
vendor/github.com/urfave/cli/cli.go [new file with mode: 0644]
vendor/github.com/urfave/cli/command.go [new file with mode: 0644]
vendor/github.com/urfave/cli/context.go [new file with mode: 0644]
vendor/github.com/urfave/cli/errors.go [new file with mode: 0644]
vendor/github.com/urfave/cli/flag-types.json [new file with mode: 0644]
vendor/github.com/urfave/cli/flag.go [new file with mode: 0644]
vendor/github.com/urfave/cli/flag_generated.go [new file with mode: 0644]
vendor/github.com/urfave/cli/funcs.go [new file with mode: 0644]
vendor/github.com/urfave/cli/generate-flag-types [new file with mode: 0755]
vendor/github.com/urfave/cli/help.go [new file with mode: 0644]
vendor/github.com/urfave/cli/runtests [new file with mode: 0755]
vendor/golang.org/x/crypto/ssh/terminal/terminal.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util_linux.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go [new file with mode: 0644]
vendor/golang.org/x/crypto/ssh/terminal/util_windows.go [new file with mode: 0644]
vendor/vendor.json

diff --git a/vendor/github.com/urfave/cli/CHANGELOG.md b/vendor/github.com/urfave/cli/CHANGELOG.md
new file mode 100644 (file)
index 0000000..07f7546
--- /dev/null
@@ -0,0 +1,392 @@
+# Change Log
+
+**ATTN**: This project uses [semantic versioning](http://semver.org/).
+
+## [Unreleased]
+
+## [1.19.1] - 2016-11-21
+
+### Fixed
+
+- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as
+  the `Action` for a command would cause it to error rather than calling the
+  function. Should not have a affected declarative cases using `func(c
+  *cli.Context) err)`.
+- Shell completion now handles the case where the user specifies
+  `--generate-bash-completion` immediately after a flag that takes an argument.
+  Previously it call the application with `--generate-bash-completion` as the
+  flag value.
+
+## [1.19.0] - 2016-11-19
+### Added
+- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`)
+- A `Description` field was added to `App` for a more detailed description of
+  the application (similar to the existing `Description` field on `Command`)
+- Flag type code generation via `go generate`
+- Write to stderr and exit 1 if action returns non-nil error
+- Added support for TOML to the `altsrc` loader
+- `SkipArgReorder` was added to allow users to skip the argument reordering.
+  This is useful if you want to consider all "flags" after an argument as
+  arguments rather than flags (the default behavior of the stdlib `flag`
+  library). This is backported functionality from the [removal of the flag
+  reordering](https://github.com/urfave/cli/pull/398) in the unreleased version
+  2
+- For formatted errors (those implementing `ErrorFormatter`), the errors will
+  be formatted during output. Compatible with `pkg/errors`.
+
+### Changed
+- Raise minimum tested/supported Go version to 1.2+
+
+### Fixed
+- Consider empty environment variables as set (previously environment variables
+  with the equivalent of `""` would be skipped rather than their value used).
+- Return an error if the value in a given environment variable cannot be parsed
+  as the flag type. Previously these errors were silently swallowed.
+- Print full error when an invalid flag is specified (which includes the invalid flag)
+- `App.Writer` defaults to `stdout` when `nil`
+- If no action is specified on a command or app, the help is now printed instead of `panic`ing
+- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized)
+- Correctly show help message if `-h` is provided to a subcommand
+- `context.(Global)IsSet` now respects environment variables. Previously it
+  would return `false` if a flag was specified in the environment rather than
+  as an argument
+- Removed deprecation warnings to STDERR to avoid them leaking to the end-user
+- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This
+  fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well
+  as `altsrc` where Go would complain that the types didn't match
+
+## [1.18.1] - 2016-08-28
+### Fixed
+- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported)
+
+## [1.18.0] - 2016-06-27
+### Added
+- `./runtests` test runner with coverage tracking by default
+- testing on OS X
+- testing on Windows
+- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code
+
+### Changed
+- Use spaces for alignment in help/usage output instead of tabs, making the
+  output alignment consistent regardless of tab width
+
+### Fixed
+- Printing of command aliases in help text
+- Printing of visible flags for both struct and struct pointer flags
+- Display the `help` subcommand when using `CommandCategories`
+- No longer swallows `panic`s that occur within the `Action`s themselves when
+  detecting the signature of the `Action` field
+
+## [1.17.1] - 2016-08-28
+### Fixed
+- Removed deprecation warnings to STDERR to avoid them leaking to the end-user
+
+## [1.17.0] - 2016-05-09
+### Added
+- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc`
+- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool`
+- Support for hiding commands by setting `Hidden: true` -- this will hide the
+  commands in help output
+
+### Changed
+- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer
+  quoted in help text output.
+- All flag types now include `(default: {value})` strings following usage when a
+  default value can be (reasonably) detected.
+- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent
+  with non-slice flag types
+- Apps now exit with a code of 3 if an unknown subcommand is specified
+  (previously they printed "No help topic for...", but still exited 0. This
+  makes it easier to script around apps built using `cli` since they can trust
+  that a 0 exit code indicated a successful execution.
+- cleanups based on [Go Report Card
+  feedback](https://goreportcard.com/report/github.com/urfave/cli)
+
+## [1.16.1] - 2016-08-28
+### Fixed
+- Removed deprecation warnings to STDERR to avoid them leaking to the end-user
+
+## [1.16.0] - 2016-05-02
+### Added
+- `Hidden` field on all flag struct types to omit from generated help text
+
+### Changed
+- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from
+generated help text via the `Hidden` field
+
+### Fixed
+- handling of error values in `HandleAction` and `HandleExitCoder`
+
+## [1.15.0] - 2016-04-30
+### Added
+- This file!
+- Support for placeholders in flag usage strings
+- `App.Metadata` map for arbitrary data/state management
+- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after
+parsing.
+- Support for nested lookup of dot-delimited keys in structures loaded from
+YAML.
+
+### Changed
+- The `App.Action` and `Command.Action` now prefer a return signature of
+`func(*cli.Context) error`, as defined by `cli.ActionFunc`.  If a non-nil
+`error` is returned, there may be two outcomes:
+    - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called
+    automatically
+    - Else the error is bubbled up and returned from `App.Run`
+- Specifying an `Action` with the legacy return signature of
+`func(*cli.Context)` will produce a deprecation message to stderr
+- Specifying an `Action` that is not a `func` type will produce a non-zero exit
+from `App.Run`
+- Specifying an `Action` func that has an invalid (input) signature will
+produce a non-zero exit from `App.Run`
+
+### Deprecated
+- <a name="deprecated-cli-app-runandexitonerror"></a>
+`cli.App.RunAndExitOnError`, which should now be done by returning an error
+that fulfills `cli.ExitCoder` to `cli.App.Run`.
+- <a name="deprecated-cli-app-action-signature"></a> the legacy signature for
+`cli.App.Action` of `func(*cli.Context)`, which should now have a return
+signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`.
+
+### Fixed
+- Added missing `*cli.Context.GlobalFloat64` method
+
+## [1.14.0] - 2016-04-03 (backfilled 2016-04-25)
+### Added
+- Codebeat badge
+- Support for categorization via `CategorizedHelp` and `Categories` on app.
+
+### Changed
+- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`.
+
+### Fixed
+- Ensure version is not shown in help text when `HideVersion` set.
+
+## [1.13.0] - 2016-03-06 (backfilled 2016-04-25)
+### Added
+- YAML file input support.
+- `NArg` method on context.
+
+## [1.12.0] - 2016-02-17 (backfilled 2016-04-25)
+### Added
+- Custom usage error handling.
+- Custom text support in `USAGE` section of help output.
+- Improved help messages for empty strings.
+- AppVeyor CI configuration.
+
+### Changed
+- Removed `panic` from default help printer func.
+- De-duping and optimizations.
+
+### Fixed
+- Correctly handle `Before`/`After` at command level when no subcommands.
+- Case of literal `-` argument causing flag reordering.
+- Environment variable hints on Windows.
+- Docs updates.
+
+## [1.11.1] - 2015-12-21 (backfilled 2016-04-25)
+### Changed
+- Use `path.Base` in `Name` and `HelpName`
+- Export `GetName` on flag types.
+
+### Fixed
+- Flag parsing when skipping is enabled.
+- Test output cleanup.
+- Move completion check to account for empty input case.
+
+## [1.11.0] - 2015-11-15 (backfilled 2016-04-25)
+### Added
+- Destination scan support for flags.
+- Testing against `tip` in Travis CI config.
+
+### Changed
+- Go version in Travis CI config.
+
+### Fixed
+- Removed redundant tests.
+- Use correct example naming in tests.
+
+## [1.10.2] - 2015-10-29 (backfilled 2016-04-25)
+### Fixed
+- Remove unused var in bash completion.
+
+## [1.10.1] - 2015-10-21 (backfilled 2016-04-25)
+### Added
+- Coverage and reference logos in README.
+
+### Fixed
+- Use specified values in help and version parsing.
+- Only display app version and help message once.
+
+## [1.10.0] - 2015-10-06 (backfilled 2016-04-25)
+### Added
+- More tests for existing functionality.
+- `ArgsUsage` at app and command level for help text flexibility.
+
+### Fixed
+- Honor `HideHelp` and `HideVersion` in `App.Run`.
+- Remove juvenile word from README.
+
+## [1.9.0] - 2015-09-08 (backfilled 2016-04-25)
+### Added
+- `FullName` on command with accompanying help output update.
+- Set default `$PROG` in bash completion.
+
+### Changed
+- Docs formatting.
+
+### Fixed
+- Removed self-referential imports in tests.
+
+## [1.8.0] - 2015-06-30 (backfilled 2016-04-25)
+### Added
+- Support for `Copyright` at app level.
+- `Parent` func at context level to walk up context lineage.
+
+### Fixed
+- Global flag processing at top level.
+
+## [1.7.1] - 2015-06-11 (backfilled 2016-04-25)
+### Added
+- Aggregate errors from `Before`/`After` funcs.
+- Doc comments on flag structs.
+- Include non-global flags when checking version and help.
+- Travis CI config updates.
+
+### Fixed
+- Ensure slice type flags have non-nil values.
+- Collect global flags from the full command hierarchy.
+- Docs prose.
+
+## [1.7.0] - 2015-05-03 (backfilled 2016-04-25)
+### Changed
+- `HelpPrinter` signature includes output writer.
+
+### Fixed
+- Specify go 1.1+ in docs.
+- Set `Writer` when running command as app.
+
+## [1.6.0] - 2015-03-23 (backfilled 2016-04-25)
+### Added
+- Multiple author support.
+- `NumFlags` at context level.
+- `Aliases` at command level.
+
+### Deprecated
+- `ShortName` at command level.
+
+### Fixed
+- Subcommand help output.
+- Backward compatible support for deprecated `Author` and `Email` fields.
+- Docs regarding `Names`/`Aliases`.
+
+## [1.5.0] - 2015-02-20 (backfilled 2016-04-25)
+### Added
+- `After` hook func support at app and command level.
+
+### Fixed
+- Use parsed context when running command as subcommand.
+- Docs prose.
+
+## [1.4.1] - 2015-01-09 (backfilled 2016-04-25)
+### Added
+- Support for hiding `-h / --help` flags, but not `help` subcommand.
+- Stop flag parsing after `--`.
+
+### Fixed
+- Help text for generic flags to specify single value.
+- Use double quotes in output for defaults.
+- Use `ParseInt` instead of `ParseUint` for int environment var values.
+- Use `0` as base when parsing int environment var values.
+
+## [1.4.0] - 2014-12-12 (backfilled 2016-04-25)
+### Added
+- Support for environment variable lookup "cascade".
+- Support for `Stdout` on app for output redirection.
+
+### Fixed
+- Print command help instead of app help in `ShowCommandHelp`.
+
+## [1.3.1] - 2014-11-13 (backfilled 2016-04-25)
+### Added
+- Docs and example code updates.
+
+### Changed
+- Default `-v / --version` flag made optional.
+
+## [1.3.0] - 2014-08-10 (backfilled 2016-04-25)
+### Added
+- `FlagNames` at context level.
+- Exposed `VersionPrinter` var for more control over version output.
+- Zsh completion hook.
+- `AUTHOR` section in default app help template.
+- Contribution guidelines.
+- `DurationFlag` type.
+
+## [1.2.0] - 2014-08-02
+### Added
+- Support for environment variable defaults on flags plus tests.
+
+## [1.1.0] - 2014-07-15
+### Added
+- Bash completion.
+- Optional hiding of built-in help command.
+- Optional skipping of flag parsing at command level.
+- `Author`, `Email`, and `Compiled` metadata on app.
+- `Before` hook func support at app and command level.
+- `CommandNotFound` func support at app level.
+- Command reference available on context.
+- `GenericFlag` type.
+- `Float64Flag` type.
+- `BoolTFlag` type.
+- `IsSet` flag helper on context.
+- More flag lookup funcs at context level.
+- More tests &amp; docs.
+
+### Changed
+- Help template updates to account for presence/absence of flags.
+- Separated subcommand help template.
+- Exposed `HelpPrinter` var for more control over help output.
+
+## [1.0.0] - 2013-11-01
+### Added
+- `help` flag in default app flag set and each command flag set.
+- Custom handling of argument parsing errors.
+- Command lookup by name at app level.
+- `StringSliceFlag` type and supporting `StringSlice` type.
+- `IntSliceFlag` type and supporting `IntSlice` type.
+- Slice type flag lookups by name at context level.
+- Export of app and command help functions.
+- More tests &amp; docs.
+
+## 0.1.0 - 2013-07-22
+### Added
+- Initial implementation.
+
+[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD
+[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0
+[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0
+[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0
+[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0
+[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0
+[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0
+[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0
+[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1
+[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0
+[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2
+[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1
+[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0
+[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0
+[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0
+[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1
+[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0
+[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0
+[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0
+[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1
+[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0
+[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1
+[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0
+[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0
+[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0
+[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0
diff --git a/vendor/github.com/urfave/cli/LICENSE b/vendor/github.com/urfave/cli/LICENSE
new file mode 100644 (file)
index 0000000..42a597e
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Jeremy Saenz & Contributors
+
+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/urfave/cli/README.md b/vendor/github.com/urfave/cli/README.md
new file mode 100644 (file)
index 0000000..2bbbd8e
--- /dev/null
@@ -0,0 +1,1381 @@
+cli
+===
+
+[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli)
+[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)
+[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)
+[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli)
+[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli)
+[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) /
+[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc)
+
+**Notice:** This is the library formerly known as
+`github.com/codegangsta/cli` -- Github will automatically redirect requests
+to this repository, but we recommend updating your references for clarity.
+
+cli is a 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.
+
+<!-- toc -->
+
+- [Overview](#overview)
+- [Installation](#installation)
+  * [Supported platforms](#supported-platforms)
+  * [Using the `v2` branch](#using-the-v2-branch)
+  * [Pinning to the `v1` releases](#pinning-to-the-v1-releases)
+- [Getting Started](#getting-started)
+- [Examples](#examples)
+  * [Arguments](#arguments)
+  * [Flags](#flags)
+    + [Placeholder Values](#placeholder-values)
+    + [Alternate Names](#alternate-names)
+    + [Ordering](#ordering)
+    + [Values from the Environment](#values-from-the-environment)
+    + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others)
+  * [Subcommands](#subcommands)
+  * [Subcommands categories](#subcommands-categories)
+  * [Exit code](#exit-code)
+  * [Bash Completion](#bash-completion)
+    + [Enabling](#enabling)
+    + [Distribution](#distribution)
+    + [Customization](#customization)
+  * [Generated Help Text](#generated-help-text)
+    + [Customization](#customization-1)
+  * [Version Flag](#version-flag)
+    + [Customization](#customization-2)
+    + [Full API Example](#full-api-example)
+- [Contribution Guidelines](#contribution-guidelines)
+
+<!-- tocstop -->
+
+## 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 comes into play.** cli makes command line programming fun,
+organized, and expressive!
+
+## Installation
+
+Make sure you have a working Go environment.  Go version 1.2+ is supported.  [See
+the install instructions for Go](http://golang.org/doc/install.html).
+
+To install cli, simply run:
+```
+$ go get github.com/urfave/cli
+```
+
+Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can
+be easily used:
+```
+export PATH=$PATH:$GOPATH/bin
+```
+
+### Supported platforms
+
+cli is tested against multiple versions of Go on Linux, and against the latest
+released version of Go on OS X and Windows.  For full details, see
+[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml).
+
+### Using the `v2` branch
+
+**Warning**: The `v2` branch is currently unreleased and considered unstable.
+
+There is currently a long-lived branch named `v2` that is intended to land as
+the new `master` branch once development there has settled down.  The current
+`master` branch (mirrored as `v1`) is being manually merged into `v2` on
+an irregular human-based schedule, but generally if one wants to "upgrade" to
+`v2` *now* and accept the volatility (read: "awesomeness") that comes along with
+that, please use whatever version pinning of your preference, such as via
+`gopkg.in`:
+
+```
+$ go get gopkg.in/urfave/cli.v2
+```
+
+``` go
+...
+import (
+  "gopkg.in/urfave/cli.v2" // imports as package "cli"
+)
+...
+```
+
+### Pinning to the `v1` releases
+
+Similarly to the section above describing use of the `v2` branch, if one wants
+to avoid any unexpected compatibility pains once `v2` becomes `master`, then
+pinning to `v1` is an acceptable option, e.g.:
+
+```
+$ go get gopkg.in/urfave/cli.v1
+```
+
+``` go
+...
+import (
+  "gopkg.in/urfave/cli.v1" // imports as package "cli"
+)
+...
+```
+
+This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing).
+
+## Getting Started
+
+One of the philosophies behind cli is that an API should be playful and full of
+discovery. So a cli app can be as little as one line of code in `main()`.
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "A new cli application"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/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:
+
+<!-- {
+  "output": "boom! I say!"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+  app.Name = "boom"
+  app.Usage = "make an explosive entrance"
+  app.Action = func(c *cli.Context) error {
+    fmt.Println("boom! I say!")
+    return nil
+  }
+
+  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.
+
+## Examples
+
+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:
+
+<!-- {
+  "output": "Hello friend!"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+  app.Name = "greet"
+  app.Usage = "fight the loneliness!"
+  app.Action = func(c *cli.Context) error {
+    fmt.Println("Hello friend!")
+    return nil
+  }
+
+  app.Run(os.Args)
+}
+```
+
+Install our command to the `$GOPATH/bin` directory:
+
+```
+$ go install
+```
+
+Finally run our new command:
+
+```
+$ greet
+Hello friend!
+```
+
+cli also generates neat 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`, e.g.:
+
+<!-- {
+  "output": "Hello \""
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Action = func(c *cli.Context) error {
+    fmt.Printf("Hello %q", c.Args().Get(0))
+    return nil
+  }
+
+  app.Run(os.Args)
+}
+```
+
+### Flags
+
+Setting and querying flags is simple.
+
+<!-- {
+  "output": "Hello Nefertiti"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name: "lang",
+      Value: "english",
+      Usage: "language for the greeting",
+    },
+  }
+
+  app.Action = func(c *cli.Context) error {
+    name := "Nefertiti"
+    if c.NArg() > 0 {
+      name = c.Args().Get(0)
+    }
+    if c.String("lang") == "spanish" {
+      fmt.Println("Hola", name)
+    } else {
+      fmt.Println("Hello", name)
+    }
+    return nil
+  }
+
+  app.Run(os.Args)
+}
+```
+
+You can also set a destination variable for a flag, to which the content will be
+scanned.
+
+<!-- {
+  "output": "Hello someone"
+} -->
+``` go
+package main
+
+import (
+  "os"
+  "fmt"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  var language string
+
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name:        "lang",
+      Value:       "english",
+      Usage:       "language for the greeting",
+      Destination: &language,
+    },
+  }
+
+  app.Action = func(c *cli.Context) error {
+    name := "someone"
+    if c.NArg() > 0 {
+      name = c.Args()[0]
+    }
+    if language == "spanish" {
+      fmt.Println("Hola", name)
+    } else {
+      fmt.Println("Hello", name)
+    }
+    return nil
+  }
+
+  app.Run(os.Args)
+}
+```
+
+See full list of flags at http://godoc.org/github.com/urfave/cli
+
+#### Placeholder Values
+
+Sometimes it's useful to specify a flag's value within the usage string itself.
+Such placeholders are indicated with back quotes.
+
+For example this:
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "&#45;&#45;config FILE, &#45;c FILE"
+} -->
+```go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag{
+    cli.StringFlag{
+      Name:  "config, c",
+      Usage: "Load configuration from `FILE`",
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+Will result in help output like:
+
+```
+--config FILE, -c FILE   Load configuration from FILE
+```
+
+Note that only the first placeholder is used. Subsequent back-quoted words will
+be left as-is.
+
+#### Alternate Names
+
+You can set alternate (or short) names for flags by providing a comma-delimited
+list for the `Name`. e.g.
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "&#45;&#45;lang value, &#45;l value.*language for the greeting.*default: \"english\""
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name: "lang, l",
+      Value: "english",
+      Usage: "language for the greeting",
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+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.
+
+#### Ordering
+
+Flags for the application and commands are shown in the order they are defined.
+However, it's possible to sort them from outside this library by using `FlagsByName`
+or `CommandsByName` with `sort`.
+
+For example this:
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "add a task to the list\n.*complete a task on the list\n.*\n\n.*\n.*Load configuration from FILE\n.*Language for the greeting.*"
+} -->
+``` go
+package main
+
+import (
+  "os"
+  "sort"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name: "lang, l",
+      Value: "english",
+      Usage: "Language for the greeting",
+    },
+    cli.StringFlag{
+      Name: "config, c",
+      Usage: "Load configuration from `FILE`",
+    },
+  }
+
+  app.Commands = []cli.Command{
+    {
+      Name:    "complete",
+      Aliases: []string{"c"},
+      Usage:   "complete a task on the list",
+      Action:  func(c *cli.Context) error {
+        return nil
+      },
+    },
+    {
+      Name:    "add",
+      Aliases: []string{"a"},
+      Usage:   "add a task to the list",
+      Action:  func(c *cli.Context) error {
+        return nil
+      },
+    },
+  }
+
+  sort.Sort(cli.FlagsByName(app.Flags))
+  sort.Sort(cli.CommandsByName(app.Commands))
+
+  app.Run(os.Args)
+}
+```
+
+Will result in help output like:
+
+```
+--config FILE, -c FILE  Load configuration from FILE
+--lang value, -l value  Language for the greeting (default: "english")
+```
+
+#### Values from the Environment
+
+You can also have the default value set from the environment via `EnvVar`.  e.g.
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "language for the greeting.*APP_LANG"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name: "lang, l",
+      Value: "english",
+      Usage: "language for the greeting",
+      EnvVar: "APP_LANG",
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+The `EnvVar` may also be given as a comma-delimited "cascade", where the first
+environment variable that resolves is used as the default.
+
+<!-- {
+  "args": ["&#45;&#45;help"],
+  "output": "language for the greeting.*LEGACY_COMPAT_LANG.*APP_LANG.*LANG"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Flags = []cli.Flag {
+    cli.StringFlag{
+      Name: "lang, l",
+      Value: "english",
+      Usage: "language for the greeting",
+      EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG",
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+#### Values from alternate input sources (YAML, TOML, and others)
+
+There is a separate package altsrc that adds support for getting flag values
+from other file input sources.
+
+Currently supported input source formats:
+* YAML
+* TOML
+
+In order to get values for a flag from an alternate input source the following
+code would be added to wrap an existing cli.Flag like below:
+
+``` go
+  altsrc.NewIntFlag(cli.IntFlag{Name: "test"})
+```
+
+Initialization must also occur for these flags. Below is an example initializing
+getting data from a yaml file below.
+
+``` go
+  command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load"))
+```
+
+The code above will use the "load" string as a flag name to get the file name of
+a yaml file from the cli.Context.  It will then use that file name to initialize
+the yaml input source for any flags that are defined on that command.  As a note
+the "load" flag used would also have to be defined on the command flags in order
+for this code snipped to work.
+
+Currently only the aboved specified formats are supported but developers can
+add support for other input sources by implementing the
+altsrc.InputSourceContext for their given sources.
+
+Here is a more complete sample of a command using YAML support:
+
+<!-- {
+  "args": ["test-cmd", "&#45;&#45;help"],
+  "output": "&#45&#45;test value.*default: 0"
+} -->
+``` go
+package notmain
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+  "github.com/urfave/cli/altsrc"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  flags := []cli.Flag{
+    altsrc.NewIntFlag(cli.IntFlag{Name: "test"}),
+    cli.StringFlag{Name: "load"},
+  }
+
+  app.Action = func(c *cli.Context) error {
+    fmt.Println("yaml ist rad")
+    return nil
+  }
+
+  app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load"))
+  app.Flags = flags
+
+  app.Run(os.Args)
+}
+```
+
+### Subcommands
+
+Subcommands can be defined for a more git-like command line app.
+
+<!-- {
+  "args": ["template", "add"],
+  "output": "new task template: .+"
+} -->
+```go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Commands = []cli.Command{
+    {
+      Name:    "add",
+      Aliases: []string{"a"},
+      Usage:   "add a task to the list",
+      Action:  func(c *cli.Context) error {
+        fmt.Println("added task: ", c.Args().First())
+        return nil
+      },
+    },
+    {
+      Name:    "complete",
+      Aliases: []string{"c"},
+      Usage:   "complete a task on the list",
+      Action:  func(c *cli.Context) error {
+        fmt.Println("completed task: ", c.Args().First())
+        return nil
+      },
+    },
+    {
+      Name:        "template",
+      Aliases:     []string{"t"},
+      Usage:       "options for task templates",
+      Subcommands: []cli.Command{
+        {
+          Name:  "add",
+          Usage: "add a new template",
+          Action: func(c *cli.Context) error {
+            fmt.Println("new task template: ", c.Args().First())
+            return nil
+          },
+        },
+        {
+          Name:  "remove",
+          Usage: "remove an existing template",
+          Action: func(c *cli.Context) error {
+            fmt.Println("removed task template: ", c.Args().First())
+            return nil
+          },
+        },
+      },
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+### Subcommands categories
+
+For additional organization in apps that have many subcommands, you can
+associate a category for each command to group them together in the help
+output.
+
+E.g.
+
+```go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+
+  app.Commands = []cli.Command{
+    {
+      Name: "noop",
+    },
+    {
+      Name:     "add",
+      Category: "template",
+    },
+    {
+      Name:     "remove",
+      Category: "template",
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+Will include:
+
+```
+COMMANDS:
+    noop
+
+  Template actions:
+    add
+    remove
+```
+
+### Exit code
+
+Calling `App.Run` will not automatically call `os.Exit`, which means that by
+default the exit code will "fall through" to being `0`.  An explicit exit code
+may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a
+`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.:
+
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  app := cli.NewApp()
+  app.Flags = []cli.Flag{
+    cli.BoolTFlag{
+      Name:  "ginger-crouton",
+      Usage: "is it in the soup?",
+    },
+  }
+  app.Action = func(ctx *cli.Context) error {
+    if !ctx.Bool("ginger-crouton") {
+      return cli.NewExitError("it is not in the soup", 86)
+    }
+    return nil
+  }
+
+  app.Run(os.Args)
+}
+```
+
+### 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.
+
+<!-- {
+  "args": ["complete", "&#45;&#45;generate&#45;bash&#45;completion"],
+  "output": "laundry"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  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) error {
+         fmt.Println("completed task: ", c.Args().First())
+         return nil
+      },
+      BashComplete: func(c *cli.Context) {
+        // This will complete if no args are passed
+        if c.NArg() > 0 {
+          return
+        }
+        for _, t := range tasks {
+          fmt.Println(t)
+        }
+      },
+    },
+  }
+
+  app.Run(os.Args)
+}
+```
+
+#### Enabling
+
+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`
+
+#### Distribution
+
+Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename
+it to the name of the program you wish to add autocomplete support for (or
+automatically install it there if you are distributing a package). Don't forget
+to source the file to make it active in the current shell.
+
+```
+sudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram>
+source /etc/bash_completion.d/<myprogram>
+```
+
+Alternatively, you can just document that users should source the generic
+`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set
+to the name of their program (as above).
+
+#### Customization
+
+The default bash completion flag (`--generate-bash-completion`) is defined as
+`cli.BashCompletionFlag`, and may be redefined if desired, e.g.:
+
+<!-- {
+  "args": ["&#45;&#45;compgen"],
+  "output": "wat\nhelp\nh"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  cli.BashCompletionFlag = cli.BoolFlag{
+    Name:   "compgen",
+    Hidden: true,
+  }
+
+  app := cli.NewApp()
+  app.EnableBashCompletion = true
+  app.Commands = []cli.Command{
+    {
+      Name: "wat",
+    },
+  }
+  app.Run(os.Args)
+}
+```
+
+### Generated Help Text
+
+The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked
+by the cli internals in order to print generated help text for the app, command,
+or subcommand, and break execution.
+
+#### Customization
+
+All of the help text generation may be customized, and at multiple levels.  The
+templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and
+`SubcommandHelpTemplate` which may be reassigned or augmented, and full override
+is possible by assigning a compatible func to the `cli.HelpPrinter` variable,
+e.g.:
+
+<!-- {
+  "output": "Ha HA.  I pwnd the help!!1"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "io"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  // EXAMPLE: Append to an existing template
+  cli.AppHelpTemplate = fmt.Sprintf(`%s
+
+WEBSITE: http://awesometown.example.com
+
+SUPPORT: support@awesometown.example.com
+
+`, cli.AppHelpTemplate)
+
+  // EXAMPLE: Override a template
+  cli.AppHelpTemplate = `NAME:
+   {{.Name}} - {{.Usage}}
+USAGE:
+   {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
+   {{if len .Authors}}
+AUTHOR:
+   {{range .Authors}}{{ . }}{{end}}
+   {{end}}{{if .Commands}}
+COMMANDS:
+{{range .Commands}}{{if not .HideHelp}}   {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
+GLOBAL OPTIONS:
+   {{range .VisibleFlags}}{{.}}
+   {{end}}{{end}}{{if .Copyright }}
+COPYRIGHT:
+   {{.Copyright}}
+   {{end}}{{if .Version}}
+VERSION:
+   {{.Version}}
+   {{end}}
+`
+
+  // EXAMPLE: Replace the `HelpPrinter` func
+  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {
+    fmt.Println("Ha HA.  I pwnd the help!!1")
+  }
+
+  cli.NewApp().Run(os.Args)
+}
+```
+
+The default flag may be customized to something other than `-h/--help` by
+setting `cli.HelpFlag`, e.g.:
+
+<!-- {
+  "args": ["&#45;&#45halp"],
+  "output": "haaaaalp.*HALP"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  cli.HelpFlag = cli.BoolFlag{
+    Name: "halp, haaaaalp",
+    Usage: "HALP",
+    EnvVar: "SHOW_HALP,HALPPLZ",
+  }
+
+  cli.NewApp().Run(os.Args)
+}
+```
+
+### Version Flag
+
+The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which
+is checked by the cli internals in order to print the `App.Version` via
+`cli.VersionPrinter` and break execution.
+
+#### Customization
+
+The default flag may be customized to something other than `-v/--version` by
+setting `cli.VersionFlag`, e.g.:
+
+<!-- {
+  "args": ["&#45;&#45print-version"],
+  "output": "partay version 19\\.99\\.0"
+} -->
+``` go
+package main
+
+import (
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+func main() {
+  cli.VersionFlag = cli.BoolFlag{
+    Name: "print-version, V",
+    Usage: "print only the version",
+  }
+
+  app := cli.NewApp()
+  app.Name = "partay"
+  app.Version = "19.99.0"
+  app.Run(os.Args)
+}
+```
+
+Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.:
+
+<!-- {
+  "args": ["&#45;&#45version"],
+  "output": "version=19\\.99\\.0 revision=fafafaf"
+} -->
+``` go
+package main
+
+import (
+  "fmt"
+  "os"
+
+  "github.com/urfave/cli"
+)
+
+var (
+  Revision = "fafafaf"
+)
+
+func main() {
+  cli.VersionPrinter = func(c *cli.Context) {
+    fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision)
+  }
+
+  app := cli.NewApp()
+  app.Name = "partay"
+  app.Version = "19.99.0"
+  app.Run(os.Args)
+}
+```
+
+#### Full API Example
+
+**Notice**: This is a contrived (functioning) example meant strictly for API
+demonstration purposes.  Use of one's imagination is encouraged.
+
+<!-- {
+  "output": "made it!\nPhew!"
+} -->
+``` go
+package main
+
+import (
+  "errors"
+  "flag"
+  "fmt"
+  "io"
+  "io/ioutil"
+  "os"
+  "time"
+
+  "github.com/urfave/cli"
+)
+
+func init() {
+  cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n"
+  cli.CommandHelpTemplate += "\nYMMV\n"
+  cli.SubcommandHelpTemplate += "\nor something\n"
+
+  cli.HelpFlag = cli.BoolFlag{Name: "halp"}
+  cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true}
+  cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"}
+
+  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {
+    fmt.Fprintf(w, "best of luck to you\n")
+  }
+  cli.VersionPrinter = func(c *cli.Context) {
+    fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version)
+  }
+  cli.OsExiter = func(c int) {
+    fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c)
+  }
+  cli.ErrWriter = ioutil.Discard
+  cli.FlagStringer = func(fl cli.Flag) string {
+    return fmt.Sprintf("\t\t%s", fl.GetName())
+  }
+}
+
+type hexWriter struct{}
+
+func (w *hexWriter) Write(p []byte) (int, error) {
+  for _, b := range p {
+    fmt.Printf("%x", b)
+  }
+  fmt.Printf("\n")
+
+  return len(p), nil
+}
+
+type genericType struct{
+  s string
+}
+
+func (g *genericType) Set(value string) error {
+  g.s = value
+  return nil
+}
+
+func (g *genericType) String() string {
+  return g.s
+}
+
+func main() {
+  app := cli.NewApp()
+  app.Name = "kÉ™nˈtrÄ«v"
+  app.Version = "19.99.0"
+  app.Compiled = time.Now()
+  app.Authors = []cli.Author{
+    cli.Author{
+      Name:  "Example Human",
+      Email: "human@example.com",
+    },
+  }
+  app.Copyright = "(c) 1999 Serious Enterprise"
+  app.HelpName = "contrive"
+  app.Usage = "demonstrate available API"
+  app.UsageText = "contrive - demonstrating the available API"
+  app.ArgsUsage = "[args and such]"
+  app.Commands = []cli.Command{
+    cli.Command{
+      Name:        "doo",
+      Aliases:     []string{"do"},
+      Category:    "motion",
+      Usage:       "do the doo",
+      UsageText:   "doo - does the dooing",
+      Description: "no really, there is a lot of dooing to be done",
+      ArgsUsage:   "[arrgh]",
+      Flags: []cli.Flag{
+        cli.BoolFlag{Name: "forever, forevvarr"},
+      },
+      Subcommands: cli.Commands{
+        cli.Command{
+          Name:   "wop",
+          Action: wopAction,
+        },
+      },
+      SkipFlagParsing: false,
+      HideHelp:        false,
+      Hidden:          false,
+      HelpName:        "doo!",
+      BashComplete: func(c *cli.Context) {
+        fmt.Fprintf(c.App.Writer, "--better\n")
+      },
+      Before: func(c *cli.Context) error {
+        fmt.Fprintf(c.App.Writer, "brace for impact\n")
+        return nil
+      },
+      After: func(c *cli.Context) error {
+        fmt.Fprintf(c.App.Writer, "did we lose anyone?\n")
+        return nil
+      },
+      Action: func(c *cli.Context) error {
+        c.Command.FullName()
+        c.Command.HasName("wop")
+        c.Command.Names()
+        c.Command.VisibleFlags()
+        fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n")
+        if c.Bool("forever") {
+          c.Command.Run(c)
+        }
+        return nil
+      },
+      OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error {
+        fmt.Fprintf(c.App.Writer, "for shame\n")
+        return err
+      },
+    },
+  }
+  app.Flags = []cli.Flag{
+    cli.BoolFlag{Name: "fancy"},
+    cli.BoolTFlag{Name: "fancier"},
+    cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3},
+    cli.Float64Flag{Name: "howmuch"},
+    cli.GenericFlag{Name: "wat", Value: &genericType{}},
+    cli.Int64Flag{Name: "longdistance"},
+    cli.Int64SliceFlag{Name: "intervals"},
+    cli.IntFlag{Name: "distance"},
+    cli.IntSliceFlag{Name: "times"},
+    cli.StringFlag{Name: "dance-move, d"},
+    cli.StringSliceFlag{Name: "names, N"},
+    cli.UintFlag{Name: "age"},
+    cli.Uint64Flag{Name: "bigage"},
+  }
+  app.EnableBashCompletion = true
+  app.HideHelp = false
+  app.HideVersion = false
+  app.BashComplete = func(c *cli.Context) {
+    fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n")
+  }
+  app.Before = func(c *cli.Context) error {
+    fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n")
+    return nil
+  }
+  app.After = func(c *cli.Context) error {
+    fmt.Fprintf(c.App.Writer, "Phew!\n")
+    return nil
+  }
+  app.CommandNotFound = func(c *cli.Context, command string) {
+    fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command)
+  }
+  app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error {
+    if isSubcommand {
+      return err
+    }
+
+    fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err)
+    return nil
+  }
+  app.Action = func(c *cli.Context) error {
+    cli.DefaultAppComplete(c)
+    cli.HandleExitCoder(errors.New("not an exit coder, though"))
+    cli.ShowAppHelp(c)
+    cli.ShowCommandCompletions(c, "nope")
+    cli.ShowCommandHelp(c, "also-nope")
+    cli.ShowCompletions(c)
+    cli.ShowSubcommandHelp(c)
+    cli.ShowVersion(c)
+
+    categories := c.App.Categories()
+    categories.AddCommand("sounds", cli.Command{
+      Name: "bloop",
+    })
+
+    for _, category := range c.App.Categories() {
+      fmt.Fprintf(c.App.Writer, "%s\n", category.Name)
+      fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands)
+      fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands())
+    }
+
+    fmt.Printf("%#v\n", c.App.Command("doo"))
+    if c.Bool("infinite") {
+      c.App.Run([]string{"app", "doo", "wop"})
+    }
+
+    if c.Bool("forevar") {
+      c.App.RunAsSubcommand(c)
+    }
+    c.App.Setup()
+    fmt.Printf("%#v\n", c.App.VisibleCategories())
+    fmt.Printf("%#v\n", c.App.VisibleCommands())
+    fmt.Printf("%#v\n", c.App.VisibleFlags())
+
+    fmt.Printf("%#v\n", c.Args().First())
+    if len(c.Args()) > 0 {
+      fmt.Printf("%#v\n", c.Args()[1])
+    }
+    fmt.Printf("%#v\n", c.Args().Present())
+    fmt.Printf("%#v\n", c.Args().Tail())
+
+    set := flag.NewFlagSet("contrive", 0)
+    nc := cli.NewContext(c.App, set, c)
+
+    fmt.Printf("%#v\n", nc.Args())
+    fmt.Printf("%#v\n", nc.Bool("nope"))
+    fmt.Printf("%#v\n", nc.BoolT("nerp"))
+    fmt.Printf("%#v\n", nc.Duration("howlong"))
+    fmt.Printf("%#v\n", nc.Float64("hay"))
+    fmt.Printf("%#v\n", nc.Generic("bloop"))
+    fmt.Printf("%#v\n", nc.Int64("bonk"))
+    fmt.Printf("%#v\n", nc.Int64Slice("burnks"))
+    fmt.Printf("%#v\n", nc.Int("bips"))
+    fmt.Printf("%#v\n", nc.IntSlice("blups"))
+    fmt.Printf("%#v\n", nc.String("snurt"))
+    fmt.Printf("%#v\n", nc.StringSlice("snurkles"))
+    fmt.Printf("%#v\n", nc.Uint("flub"))
+    fmt.Printf("%#v\n", nc.Uint64("florb"))
+    fmt.Printf("%#v\n", nc.GlobalBool("global-nope"))
+    fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp"))
+    fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong"))
+    fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay"))
+    fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop"))
+    fmt.Printf("%#v\n", nc.GlobalInt("global-bips"))
+    fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups"))
+    fmt.Printf("%#v\n", nc.GlobalString("global-snurt"))
+    fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles"))
+
+    fmt.Printf("%#v\n", nc.FlagNames())
+    fmt.Printf("%#v\n", nc.GlobalFlagNames())
+    fmt.Printf("%#v\n", nc.GlobalIsSet("wat"))
+    fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope"))
+    fmt.Printf("%#v\n", nc.NArg())
+    fmt.Printf("%#v\n", nc.NumFlags())
+    fmt.Printf("%#v\n", nc.Parent())
+
+    nc.Set("wat", "also-nope")
+
+    ec := cli.NewExitError("ohwell", 86)
+    fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode())
+    fmt.Printf("made it!\n")
+    return ec
+  }
+
+  if os.Getenv("HEXY") != "" {
+    app.Writer = &hexWriter{}
+    app.ErrWriter = &hexWriter{}
+  }
+
+  app.Metadata = map[string]interface{}{
+    "layers":     "many",
+    "explicable": false,
+    "whatever-values": 19.99,
+  }
+
+  app.Run(os.Args)
+}
+
+func wopAction(c *cli.Context) error {
+  fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n")
+  return nil
+}
+```
+
+## 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, we 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 feel like you have contributed to the project but have not yet been
+added as a collaborator, we probably forgot to add you, please open an issue.
diff --git a/vendor/github.com/urfave/cli/app.go b/vendor/github.com/urfave/cli/app.go
new file mode 100644 (file)
index 0000000..95ffc0b
--- /dev/null
@@ -0,0 +1,492 @@
+package cli
+
+import (
+       "fmt"
+       "io"
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "sort"
+       "time"
+)
+
+var (
+       changeLogURL                    = "https://github.com/urfave/cli/blob/master/CHANGELOG.md"
+       appActionDeprecationURL         = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL)
+       runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL)
+
+       contactSysadmin = "This is an error in the application.  Please contact the distributor of this application if this is not you."
+
+       errInvalidActionType = NewExitError("ERROR invalid Action type. "+
+               fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error).  %s", contactSysadmin)+
+               fmt.Sprintf("See %s", appActionDeprecationURL), 2)
+)
+
+// App is the main structure of a cli application. It is recommended that
+// an app be created with the cli.NewApp() function
+type App struct {
+       // The name of the program. Defaults to path.Base(os.Args[0])
+       Name string
+       // Full name of command for help, defaults to Name
+       HelpName string
+       // Description of the program.
+       Usage string
+       // Text to override the USAGE section of help
+       UsageText string
+       // Description of the program argument format.
+       ArgsUsage string
+       // Version of the program
+       Version string
+       // Description of the program
+       Description 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 and the VERSION section of help
+       HideVersion bool
+       // Populate on app startup, only gettable through method Categories()
+       categories CommandCategories
+       // An action to execute when the bash-completion flag is set
+       BashComplete BashCompleteFunc
+       // 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 BeforeFunc
+       // An action to execute after any subcommands are run, but after the subcommand has finished
+       // It is run even if Action() panics
+       After AfterFunc
+
+       // The action to execute when no subcommands are specified
+       // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}`
+       // *Note*: support for the deprecated `Action` signature will be removed in a future version
+       Action interface{}
+
+       // Execute this function if the proper command cannot be found
+       CommandNotFound CommandNotFoundFunc
+       // Execute this function if an usage error occurs
+       OnUsageError OnUsageErrorFunc
+       // 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
+       // ErrWriter writes error output
+       ErrWriter io.Writer
+       // Other custom info
+       Metadata map[string]interface{}
+
+       didSetup bool
+}
+
+// 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()
+}
+
+// NewApp creates a new cli Application with some reasonable defaults for Name,
+// Usage, Version and Action.
+func NewApp() *App {
+       return &App{
+               Name:         filepath.Base(os.Args[0]),
+               HelpName:     filepath.Base(os.Args[0]),
+               Usage:        "A new cli application",
+               UsageText:    "",
+               Version:      "0.0.0",
+               BashComplete: DefaultAppComplete,
+               Action:       helpCommand.Action,
+               Compiled:     compileTime(),
+               Writer:       os.Stdout,
+       }
+}
+
+// Setup runs initialization code to ensure all data structures are ready for
+// `Run` or inspection prior to `Run`.  It is internally called by `Run`, but
+// will return early if setup has already happened.
+func (a *App) Setup() {
+       if a.didSetup {
+               return
+       }
+
+       a.didSetup = true
+
+       if a.Author != "" || a.Email != "" {
+               a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email})
+       }
+
+       newCmds := []Command{}
+       for _, c := range a.Commands {
+               if c.HelpName == "" {
+                       c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
+               }
+               newCmds = append(newCmds, c)
+       }
+       a.Commands = newCmds
+
+       if a.Command(helpCommand.Name) == nil && !a.HideHelp {
+               a.Commands = append(a.Commands, helpCommand)
+               if (HelpFlag != BoolFlag{}) {
+                       a.appendFlag(HelpFlag)
+               }
+       }
+
+       if !a.HideVersion {
+               a.appendFlag(VersionFlag)
+       }
+
+       a.categories = CommandCategories{}
+       for _, command := range a.Commands {
+               a.categories = a.categories.AddCommand(command.Category, command)
+       }
+       sort.Sort(a.categories)
+
+       if a.Metadata == nil {
+               a.Metadata = make(map[string]interface{})
+       }
+
+       if a.Writer == nil {
+               a.Writer = os.Stdout
+       }
+}
+
+// Run is the 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) {
+       a.Setup()
+
+       // handle the completion flag separately from the flagset since
+       // completion could be attempted after a flag, but before its value was put
+       // on the command line. this causes the flagset to interpret the completion
+       // flag name as the value of the flag before it which is undesirable
+       // note that we can only do this because the shell autocomplete function
+       // always appends the completion flag at the end of the command
+       shellComplete, arguments := checkShellCompleteFlag(a, arguments)
+
+       // parse flags
+       set, err := flagSet(a.Name, a.Flags)
+       if err != nil {
+               return err
+       }
+
+       set.SetOutput(ioutil.Discard)
+       err = set.Parse(arguments[1:])
+       nerr := normalizeFlags(a.Flags, set)
+       context := NewContext(a, set, nil)
+       if nerr != nil {
+               fmt.Fprintln(a.Writer, nerr)
+               ShowAppHelp(context)
+               return nerr
+       }
+       context.shellComplete = shellComplete
+
+       if checkCompletions(context) {
+               return nil
+       }
+
+       if err != nil {
+               if a.OnUsageError != nil {
+                       err := a.OnUsageError(context, err, false)
+                       HandleExitCoder(err)
+                       return err
+               }
+               fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error())
+               ShowAppHelp(context)
+               return err
+       }
+
+       if !a.HideHelp && checkHelp(context) {
+               ShowAppHelp(context)
+               return nil
+       }
+
+       if !a.HideVersion && checkVersion(context) {
+               ShowVersion(context)
+               return nil
+       }
+
+       if a.After != nil {
+               defer func() {
+                       if afterErr := a.After(context); afterErr != nil {
+                               if err != nil {
+                                       err = NewMultiError(err, afterErr)
+                               } else {
+                                       err = afterErr
+                               }
+                       }
+               }()
+       }
+
+       if a.Before != nil {
+               beforeErr := a.Before(context)
+               if beforeErr != nil {
+                       fmt.Fprintf(a.Writer, "%v\n\n", beforeErr)
+                       ShowAppHelp(context)
+                       HandleExitCoder(beforeErr)
+                       err = beforeErr
+                       return err
+               }
+       }
+
+       args := context.Args()
+       if args.Present() {
+               name := args.First()
+               c := a.Command(name)
+               if c != nil {
+                       return c.Run(context)
+               }
+       }
+
+       if a.Action == nil {
+               a.Action = helpCommand.Action
+       }
+
+       // Run default Action
+       err = HandleAction(a.Action, context)
+
+       HandleExitCoder(err)
+       return err
+}
+
+// RunAndExitOnError calls .Run() and exits non-zero if an error was returned
+//
+// Deprecated: instead you should return an error that fulfills cli.ExitCoder
+// to cli.App.Run. This will cause the application to exit with the given eror
+// code in the cli.ExitCoder
+func (a *App) RunAndExitOnError() {
+       if err := a.Run(os.Args); err != nil {
+               fmt.Fprintln(a.errWriter(), err)
+               OsExiter(1)
+       }
+}
+
+// RunAsSubcommand 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)
+                       }
+               }
+       }
+
+       newCmds := []Command{}
+       for _, c := range a.Commands {
+               if c.HelpName == "" {
+                       c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
+               }
+               newCmds = append(newCmds, c)
+       }
+       a.Commands = newCmds
+
+       // parse flags
+       set, err := flagSet(a.Name, a.Flags)
+       if err != nil {
+               return err
+       }
+
+       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 checkCompletions(context) {
+               return nil
+       }
+
+       if err != nil {
+               if a.OnUsageError != nil {
+                       err = a.OnUsageError(context, err, true)
+                       HandleExitCoder(err)
+                       return err
+               }
+               fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error())
+               ShowSubcommandHelp(context)
+               return err
+       }
+
+       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 {
+                               HandleExitCoder(err)
+                               if err != nil {
+                                       err = NewMultiError(err, afterErr)
+                               } else {
+                                       err = afterErr
+                               }
+                       }
+               }()
+       }
+
+       if a.Before != nil {
+               beforeErr := a.Before(context)
+               if beforeErr != nil {
+                       HandleExitCoder(beforeErr)
+                       err = beforeErr
+                       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
+       err = HandleAction(a.Action, context)
+
+       HandleExitCoder(err)
+       return err
+}
+
+// Command 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
+}
+
+// Categories returns a slice containing all the categories with the commands they contain
+func (a *App) Categories() CommandCategories {
+       return a.categories
+}
+
+// VisibleCategories returns a slice of categories and commands that are
+// Hidden=false
+func (a *App) VisibleCategories() []*CommandCategory {
+       ret := []*CommandCategory{}
+       for _, category := range a.categories {
+               if visible := func() *CommandCategory {
+                       for _, command := range category.Commands {
+                               if !command.Hidden {
+                                       return category
+                               }
+                       }
+                       return nil
+               }(); visible != nil {
+                       ret = append(ret, visible)
+               }
+       }
+       return ret
+}
+
+// VisibleCommands returns a slice of the Commands with Hidden=false
+func (a *App) VisibleCommands() []Command {
+       ret := []Command{}
+       for _, command := range a.Commands {
+               if !command.Hidden {
+                       ret = append(ret, command)
+               }
+       }
+       return ret
+}
+
+// VisibleFlags returns a slice of the Flags with Hidden=false
+func (a *App) VisibleFlags() []Flag {
+       return visibleFlags(a.Flags)
+}
+
+func (a *App) hasFlag(flag Flag) bool {
+       for _, f := range a.Flags {
+               if flag == f {
+                       return true
+               }
+       }
+
+       return false
+}
+
+func (a *App) errWriter() io.Writer {
+
+       // When the app ErrWriter is nil use the package level one.
+       if a.ErrWriter == nil {
+               return ErrWriter
+       }
+
+       return a.ErrWriter
+}
+
+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)
+}
+
+// HandleAction attempts to figure out which Action signature was used.  If
+// it's an ActionFunc or a func with the legacy signature for Action, the func
+// is run!
+func HandleAction(action interface{}, context *Context) (err error) {
+       if a, ok := action.(ActionFunc); ok {
+               return a(context)
+       } else if a, ok := action.(func(*Context) error); ok {
+               return a(context)
+       } else if a, ok := action.(func(*Context)); ok { // deprecated function signature
+               a(context)
+               return nil
+       } else {
+               return errInvalidActionType
+       }
+}
diff --git a/vendor/github.com/urfave/cli/appveyor.yml b/vendor/github.com/urfave/cli/appveyor.yml
new file mode 100644 (file)
index 0000000..698b188
--- /dev/null
@@ -0,0 +1,24 @@
+version: "{build}"
+
+os: Windows Server 2012 R2
+
+clone_folder: c:\gopath\src\github.com\urfave\cli
+
+environment:
+  GOPATH: C:\gopath
+  GOVERSION: 1.6
+  PYTHON: C:\Python27-x64
+  PYTHON_VERSION: 2.7.x
+  PYTHON_ARCH: 64
+
+install:
+- set PATH=%GOPATH%\bin;C:\go\bin;%PATH%
+- go version
+- go env
+- go get github.com/urfave/gfmrun/...
+- go get -v -t ./...
+
+build_script:
+- python runtests vet
+- python runtests test
+- python runtests gfmrun
diff --git a/vendor/github.com/urfave/cli/category.go b/vendor/github.com/urfave/cli/category.go
new file mode 100644 (file)
index 0000000..1a60550
--- /dev/null
@@ -0,0 +1,44 @@
+package cli
+
+// CommandCategories is a slice of *CommandCategory.
+type CommandCategories []*CommandCategory
+
+// CommandCategory is a category containing commands.
+type CommandCategory struct {
+       Name     string
+       Commands Commands
+}
+
+func (c CommandCategories) Less(i, j int) bool {
+       return c[i].Name < c[j].Name
+}
+
+func (c CommandCategories) Len() int {
+       return len(c)
+}
+
+func (c CommandCategories) Swap(i, j int) {
+       c[i], c[j] = c[j], c[i]
+}
+
+// AddCommand adds a command to a category.
+func (c CommandCategories) AddCommand(category string, command Command) CommandCategories {
+       for _, commandCategory := range c {
+               if commandCategory.Name == category {
+                       commandCategory.Commands = append(commandCategory.Commands, command)
+                       return c
+               }
+       }
+       return append(c, &CommandCategory{Name: category, Commands: []Command{command}})
+}
+
+// VisibleCommands returns a slice of the Commands with Hidden=false
+func (c *CommandCategory) VisibleCommands() []Command {
+       ret := []Command{}
+       for _, command := range c.Commands {
+               if !command.Hidden {
+                       ret = append(ret, command)
+               }
+       }
+       return ret
+}
diff --git a/vendor/github.com/urfave/cli/cli.go b/vendor/github.com/urfave/cli/cli.go
new file mode 100644 (file)
index 0000000..74fd101
--- /dev/null
@@ -0,0 +1,21 @@
+// 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) error {
+//       println("Greetings")
+//     }
+//
+//     app.Run(os.Args)
+//   }
+package cli
+
+//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go
diff --git a/vendor/github.com/urfave/cli/command.go b/vendor/github.com/urfave/cli/command.go
new file mode 100644 (file)
index 0000000..84946e7
--- /dev/null
@@ -0,0 +1,300 @@
+package cli
+
+import (
+       "fmt"
+       "io/ioutil"
+       "sort"
+       "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
+       // Custom text to show on USAGE section of help
+       UsageText string
+       // A longer explanation of how the command works
+       Description string
+       // A short description of the arguments of this command
+       ArgsUsage string
+       // The category the command is part of
+       Category string
+       // The function to call when checking for bash command completions
+       BashComplete BashCompleteFunc
+       // 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 BeforeFunc
+       // An action to execute after any subcommands are run, but after the subcommand has finished
+       // It is run even if Action() panics
+       After AfterFunc
+       // The function to call when this command is invoked
+       Action interface{}
+       // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind
+       // of deprecation period has passed, maybe?
+
+       // Execute this function if a usage error occurs.
+       OnUsageError OnUsageErrorFunc
+       // List of child commands
+       Subcommands Commands
+       // List of flags to parse
+       Flags []Flag
+       // Treat all flags as normal arguments if true
+       SkipFlagParsing bool
+       // Skip argument reordering which attempts to move flags before arguments,
+       // but only works if all flags appear after all arguments. This behavior was
+       // removed n version 2 since it only works under specific conditions so we
+       // backport here by exposing it as an option for compatibility.
+       SkipArgReorder bool
+       // Boolean to hide built-in help command
+       HideHelp bool
+       // Boolean to hide this command from help or completion
+       Hidden bool
+
+       // Full name of command for help, defaults to full command name, including parent commands.
+       HelpName        string
+       commandNamePath []string
+}
+
+type CommandsByName []Command
+
+func (c CommandsByName) Len() int {
+       return len(c)
+}
+
+func (c CommandsByName) Less(i, j int) bool {
+       return c[i].Name < c[j].Name
+}
+
+func (c CommandsByName) Swap(i, j int) {
+       c[i], c[j] = c[j], c[i]
+}
+
+// FullName 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, " ")
+}
+
+// Commands is a slice of Command
+type Commands []Command
+
+// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags
+func (c Command) Run(ctx *Context) (err error) {
+       if len(c.Subcommands) > 0 {
+               return c.startApp(ctx)
+       }
+
+       if !c.HideHelp && (HelpFlag != BoolFlag{}) {
+               // append help to flags
+               c.Flags = append(
+                       c.Flags,
+                       HelpFlag,
+               )
+       }
+
+       set, err := flagSet(c.Name, c.Flags)
+       if err != nil {
+               return err
+       }
+       set.SetOutput(ioutil.Discard)
+
+       if c.SkipFlagParsing {
+               err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...))
+       } else if !c.SkipArgReorder {
+               firstFlagIndex := -1
+               terminatorIndex := -1
+               for index, arg := range ctx.Args() {
+                       if arg == "--" {
+                               terminatorIndex = index
+                               break
+                       } else if arg == "-" {
+                               // Do nothing. A dash alone is not really a flag.
+                               continue
+                       } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 {
+                               firstFlagIndex = index
+                       }
+               }
+
+               if firstFlagIndex > -1 {
+                       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())
+               }
+       } else {
+               err = set.Parse(ctx.Args().Tail())
+       }
+
+       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)
+       context.Command = c
+       if checkCommandCompletions(context, c.Name) {
+               return nil
+       }
+
+       if err != nil {
+               if c.OnUsageError != nil {
+                       err := c.OnUsageError(context, err, false)
+                       HandleExitCoder(err)
+                       return err
+               }
+               fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error())
+               fmt.Fprintln(context.App.Writer)
+               ShowCommandHelp(context, c.Name)
+               return err
+       }
+
+       if checkCommandHelp(context, c.Name) {
+               return nil
+       }
+
+       if c.After != nil {
+               defer func() {
+                       afterErr := c.After(context)
+                       if afterErr != nil {
+                               HandleExitCoder(err)
+                               if err != nil {
+                                       err = NewMultiError(err, afterErr)
+                               } else {
+                                       err = afterErr
+                               }
+                       }
+               }()
+       }
+
+       if c.Before != nil {
+               err = c.Before(context)
+               if err != nil {
+                       fmt.Fprintln(context.App.Writer, err)
+                       fmt.Fprintln(context.App.Writer)
+                       ShowCommandHelp(context, c.Name)
+                       HandleExitCoder(err)
+                       return err
+               }
+       }
+
+       if c.Action == nil {
+               c.Action = helpSubcommand.Action
+       }
+
+       err = HandleAction(c.Action, context)
+
+       if err != nil {
+               HandleExitCoder(err)
+       }
+       return err
+}
+
+// Names returns the names including short names and aliases.
+func (c Command) Names() []string {
+       names := []string{c.Name}
+
+       if c.ShortName != "" {
+               names = append(names, c.ShortName)
+       }
+
+       return append(names, c.Aliases...)
+}
+
+// HasName 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()
+       app.Metadata = ctx.App.Metadata
+       // set the name and usage
+       app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name)
+       if c.HelpName == "" {
+               app.HelpName = c.HelpName
+       } else {
+               app.HelpName = app.Name
+       }
+
+       app.Usage = c.Usage
+       app.Description = c.Description
+       app.ArgsUsage = c.ArgsUsage
+
+       // 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
+       app.ErrWriter = ctx.App.ErrWriter
+
+       app.categories = CommandCategories{}
+       for _, command := range c.Subcommands {
+               app.categories = app.categories.AddCommand(command.Category, command)
+       }
+
+       sort.Sort(app.categories)
+
+       // 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
+       }
+       app.OnUsageError = c.OnUsageError
+
+       for index, cc := range app.Commands {
+               app.Commands[index].commandNamePath = []string{c.Name, cc.Name}
+       }
+
+       return app.RunAsSubcommand(ctx)
+}
+
+// VisibleFlags returns a slice of the Flags with Hidden=false
+func (c Command) VisibleFlags() []Flag {
+       return visibleFlags(c.Flags)
+}
diff --git a/vendor/github.com/urfave/cli/context.go b/vendor/github.com/urfave/cli/context.go
new file mode 100644 (file)
index 0000000..cb89e92
--- /dev/null
@@ -0,0 +1,276 @@
+package cli
+
+import (
+       "errors"
+       "flag"
+       "reflect"
+       "strings"
+       "syscall"
+)
+
+// 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
+       shellComplete bool
+       flagSet       *flag.FlagSet
+       setFlags      map[string]bool
+       parentContext *Context
+}
+
+// NewContext creates a new context. For use in when invoking an App or Command action.
+func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
+       c := &Context{App: app, flagSet: set, parentContext: parentCtx}
+
+       if parentCtx != nil {
+               c.shellComplete = parentCtx.shellComplete
+       }
+
+       return c
+}
+
+// NumFlags returns the number of flags set
+func (c *Context) NumFlags() int {
+       return c.flagSet.NFlag()
+}
+
+// Set sets a context flag to a value.
+func (c *Context) Set(name, value string) error {
+       return c.flagSet.Set(name, value)
+}
+
+// GlobalSet sets a context flag to a value on the global flagset
+func (c *Context) GlobalSet(name, value string) error {
+       return globalContext(c).flagSet.Set(name, value)
+}
+
+// IsSet 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
+               })
+
+               c.flagSet.VisitAll(func(f *flag.Flag) {
+                       if _, ok := c.setFlags[f.Name]; ok {
+                               return
+                       }
+                       c.setFlags[f.Name] = false
+               })
+
+               // XXX hack to support IsSet for flags with EnvVar
+               //
+               // There isn't an easy way to do this with the current implementation since
+               // whether a flag was set via an environment variable is very difficult to
+               // determine here. Instead, we intend to introduce a backwards incompatible
+               // change in version 2 to add `IsSet` to the Flag interface to push the
+               // responsibility closer to where the information required to determine
+               // whether a flag is set by non-standard means such as environment
+               // variables is avaliable.
+               //
+               // See https://github.com/urfave/cli/issues/294 for additional discussion
+               flags := c.Command.Flags
+               if c.Command.Name == "" { // cannot == Command{} since it contains slice types
+                       if c.App != nil {
+                               flags = c.App.Flags
+                       }
+               }
+               for _, f := range flags {
+                       eachName(f.GetName(), func(name string) {
+                               if isSet, ok := c.setFlags[name]; isSet || !ok {
+                                       return
+                               }
+
+                               val := reflect.ValueOf(f)
+                               if val.Kind() == reflect.Ptr {
+                                       val = val.Elem()
+                               }
+
+                               envVarValue := val.FieldByName("EnvVar")
+                               if !envVarValue.IsValid() {
+                                       return
+                               }
+
+                               eachName(envVarValue.String(), func(envVar string) {
+                                       envVar = strings.TrimSpace(envVar)
+                                       if _, ok := syscall.Getenv(envVar); ok {
+                                               c.setFlags[name] = true
+                                               return
+                                       }
+                               })
+                       })
+               }
+       }
+
+       return c.setFlags[name]
+}
+
+// GlobalIsSet determines if the global flag was actually set
+func (c *Context) GlobalIsSet(name string) bool {
+       ctx := c
+       if ctx.parentContext != nil {
+               ctx = ctx.parentContext
+       }
+
+       for ; ctx != nil; ctx = ctx.parentContext {
+               if ctx.IsSet(name) {
+                       return true
+               }
+       }
+       return false
+}
+
+// FlagNames 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
+}
+
+// GlobalFlagNames 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
+}
+
+// Parent returns the parent context, if any
+func (c *Context) Parent() *Context {
+       return c.parentContext
+}
+
+// value returns the value of the flag coressponding to `name`
+func (c *Context) value(name string) interface{} {
+       return c.flagSet.Lookup(name).Value.(flag.Getter).Get()
+}
+
+// Args contains apps console arguments
+type Args []string
+
+// Args returns the command line arguments associated with the context.
+func (c *Context) Args() Args {
+       args := Args(c.flagSet.Args())
+       return args
+}
+
+// NArg returns the number of the command line arguments.
+func (c *Context) NArg() int {
+       return len(c.Args())
+}
+
+// Get returns the nth argument, or else a blank string
+func (a Args) Get(n int) string {
+       if len(a) > n {
+               return a[n]
+       }
+       return ""
+}
+
+// First returns the first argument, or else a blank string
+func (a Args) First() string {
+       return a.Get(0)
+}
+
+// Tail returns 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{}
+}
+
+// Present checks if there are any arguments present
+func (a Args) Present() bool {
+       return len(a) != 0
+}
+
+// Swap 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 globalContext(ctx *Context) *Context {
+       if ctx == nil {
+               return nil
+       }
+
+       for {
+               if ctx.parentContext == nil {
+                       return ctx
+               }
+               ctx = ctx.parentContext
+       }
+}
+
+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 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/urfave/cli/errors.go b/vendor/github.com/urfave/cli/errors.go
new file mode 100644 (file)
index 0000000..562b295
--- /dev/null
@@ -0,0 +1,115 @@
+package cli
+
+import (
+       "fmt"
+       "io"
+       "os"
+       "strings"
+)
+
+// OsExiter is the function used when the app exits. If not set defaults to os.Exit.
+var OsExiter = os.Exit
+
+// ErrWriter is used to write errors to the user. This can be anything
+// implementing the io.Writer interface and defaults to os.Stderr.
+var ErrWriter io.Writer = os.Stderr
+
+// MultiError is an error that wraps multiple errors.
+type MultiError struct {
+       Errors []error
+}
+
+// NewMultiError creates a new MultiError. Pass in one or more errors.
+func NewMultiError(err ...error) MultiError {
+       return MultiError{Errors: err}
+}
+
+// Error implements the error interface.
+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")
+}
+
+type ErrorFormatter interface {
+       Format(s fmt.State, verb rune)
+}
+
+// ExitCoder is the interface checked by `App` and `Command` for a custom exit
+// code
+type ExitCoder interface {
+       error
+       ExitCode() int
+}
+
+// ExitError fulfills both the builtin `error` interface and `ExitCoder`
+type ExitError struct {
+       exitCode int
+       message  interface{}
+}
+
+// NewExitError makes a new *ExitError
+func NewExitError(message interface{}, exitCode int) *ExitError {
+       return &ExitError{
+               exitCode: exitCode,
+               message:  message,
+       }
+}
+
+// Error returns the string message, fulfilling the interface required by
+// `error`
+func (ee *ExitError) Error() string {
+       return fmt.Sprintf("%v", ee.message)
+}
+
+// ExitCode returns the exit code, fulfilling the interface required by
+// `ExitCoder`
+func (ee *ExitError) ExitCode() int {
+       return ee.exitCode
+}
+
+// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if
+// so prints the error to stderr (if it is non-empty) and calls OsExiter with the
+// given exit code.  If the given error is a MultiError, then this func is
+// called on all members of the Errors slice and calls OsExiter with the last exit code.
+func HandleExitCoder(err error) {
+       if err == nil {
+               return
+       }
+
+       if exitErr, ok := err.(ExitCoder); ok {
+               if err.Error() != "" {
+                       if _, ok := exitErr.(ErrorFormatter); ok {
+                               fmt.Fprintf(ErrWriter, "%+v\n", err)
+                       } else {
+                               fmt.Fprintln(ErrWriter, err)
+                       }
+               }
+               OsExiter(exitErr.ExitCode())
+               return
+       }
+
+       if multiErr, ok := err.(MultiError); ok {
+               code := handleMultiError(multiErr)
+               OsExiter(code)
+               return
+       }
+}
+
+func handleMultiError(multiErr MultiError) int {
+       code := 1
+       for _, merr := range multiErr.Errors {
+               if multiErr2, ok := merr.(MultiError); ok {
+                       code = handleMultiError(multiErr2)
+               } else {
+                       fmt.Fprintln(ErrWriter, merr)
+                       if exitErr, ok := merr.(ExitCoder); ok {
+                               code = exitErr.ExitCode()
+                       }
+               }
+       }
+       return code
+}
diff --git a/vendor/github.com/urfave/cli/flag-types.json b/vendor/github.com/urfave/cli/flag-types.json
new file mode 100644 (file)
index 0000000..1223107
--- /dev/null
@@ -0,0 +1,93 @@
+[
+  {
+    "name": "Bool",
+    "type": "bool",
+    "value": false,
+    "context_default": "false",
+    "parser": "strconv.ParseBool(f.Value.String())"
+  },
+  {
+    "name": "BoolT",
+    "type": "bool",
+    "value": false,
+    "doctail": " that is true by default",
+    "context_default": "false",
+    "parser": "strconv.ParseBool(f.Value.String())"
+  },
+  {
+    "name": "Duration",
+    "type": "time.Duration",
+    "doctail": " (see https://golang.org/pkg/time/#ParseDuration)",
+    "context_default": "0",
+    "parser": "time.ParseDuration(f.Value.String())"
+  },
+  {
+    "name": "Float64",
+    "type": "float64",
+    "context_default": "0",
+    "parser": "strconv.ParseFloat(f.Value.String(), 64)"
+  },
+  {
+    "name": "Generic",
+    "type": "Generic",
+    "dest": false,
+    "context_default": "nil",
+    "context_type": "interface{}"
+  },
+  {
+    "name": "Int64",
+    "type": "int64",
+    "context_default": "0",
+    "parser": "strconv.ParseInt(f.Value.String(), 0, 64)"
+  },
+  {
+    "name": "Int",
+    "type": "int",
+    "context_default": "0",
+    "parser": "strconv.ParseInt(f.Value.String(), 0, 64)",
+    "parser_cast": "int(parsed)"
+  },
+  {
+    "name": "IntSlice",
+    "type": "*IntSlice",
+    "dest": false,
+    "context_default": "nil",
+    "context_type": "[]int",
+    "parser": "(f.Value.(*IntSlice)).Value(), error(nil)"
+  },
+  {
+    "name": "Int64Slice",
+    "type": "*Int64Slice",
+    "dest": false,
+    "context_default": "nil",
+    "context_type": "[]int64",
+    "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)"
+  },
+  {
+    "name": "String",
+    "type": "string",
+    "context_default": "\"\"",
+    "parser": "f.Value.String(), error(nil)"
+  },
+  {
+    "name": "StringSlice",
+    "type": "*StringSlice",
+    "dest": false,
+    "context_default": "nil",
+    "context_type": "[]string",
+    "parser": "(f.Value.(*StringSlice)).Value(), error(nil)"
+  },
+  {
+    "name": "Uint64",
+    "type": "uint64",
+    "context_default": "0",
+    "parser": "strconv.ParseUint(f.Value.String(), 0, 64)"
+  },
+  {
+    "name": "Uint",
+    "type": "uint",
+    "context_default": "0",
+    "parser": "strconv.ParseUint(f.Value.String(), 0, 64)",
+    "parser_cast": "uint(parsed)"
+  }
+]
diff --git a/vendor/github.com/urfave/cli/flag.go b/vendor/github.com/urfave/cli/flag.go
new file mode 100644 (file)
index 0000000..877ff35
--- /dev/null
@@ -0,0 +1,799 @@
+package cli
+
+import (
+       "flag"
+       "fmt"
+       "reflect"
+       "runtime"
+       "strconv"
+       "strings"
+       "syscall"
+       "time"
+)
+
+const defaultPlaceholder = "value"
+
+// BashCompletionFlag enables bash-completion for all commands and subcommands
+var BashCompletionFlag Flag = BoolFlag{
+       Name:   "generate-bash-completion",
+       Hidden: true,
+}
+
+// VersionFlag prints the version for the application
+var VersionFlag Flag = BoolFlag{
+       Name:  "version, v",
+       Usage: "print the version",
+}
+
+// HelpFlag 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 Flag = BoolFlag{
+       Name:  "help, h",
+       Usage: "show help",
+}
+
+// FlagStringer converts a flag definition to a string. This is used by help
+// to display a flag.
+var FlagStringer FlagStringFunc = stringifyFlag
+
+// FlagsByName is a slice of Flag.
+type FlagsByName []Flag
+
+func (f FlagsByName) Len() int {
+       return len(f)
+}
+
+func (f FlagsByName) Less(i, j int) bool {
+       return f[i].GetName() < f[j].GetName()
+}
+
+func (f FlagsByName) Swap(i, j int) {
+       f[i], f[j] = f[j], f[i]
+}
+
+// Flag is a common interface related to parsing flags in cli.
+// For more advanced flag parsing techniques, it is recommended that
+// this interface be implemented.
+type Flag interface {
+       fmt.Stringer
+       // Apply Flag settings to the given flag set
+       Apply(*flag.FlagSet)
+       GetName() string
+}
+
+// errorableFlag is an interface that allows us to return errors during apply
+// it allows flags defined in this library to return errors in a fashion backwards compatible
+// TODO remove in v2 and modify the existing Flag interface to return errors
+type errorableFlag interface {
+       Flag
+
+       ApplyWithError(*flag.FlagSet) error
+}
+
+func flagSet(name string, flags []Flag) (*flag.FlagSet, error) {
+       set := flag.NewFlagSet(name, flag.ContinueOnError)
+
+       for _, f := range flags {
+               //TODO remove in v2 when errorableFlag is removed
+               if ef, ok := f.(errorableFlag); ok {
+                       if err := ef.ApplyWithError(set); err != nil {
+                               return nil, err
+                       }
+               } else {
+                       f.Apply(set)
+               }
+       }
+       return set, nil
+}
+
+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
+}
+
+// Apply takes the flagset and calls Set on the generic flag with the value
+// provided by the user for parsing by the flag
+// Ignores parsing errors
+func (f GenericFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError 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) ApplyWithError(set *flag.FlagSet) error {
+       val := f.Value
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               if err := val.Set(envVal); err != nil {
+                                       return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err)
+                               }
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               set.Var(f.Value, name, f.Usage)
+       })
+
+       return nil
+}
+
+// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter
+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
+}
+
+// Get returns the slice of strings set by this flag
+func (f *StringSlice) Get() interface{} {
+       return *f
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f StringSliceFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               newVal := &StringSlice{}
+                               for _, s := range strings.Split(envVal, ",") {
+                                       s = strings.TrimSpace(s)
+                                       if err := newVal.Set(s); err != nil {
+                                               return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err)
+                                       }
+                               }
+                               f.Value = newVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Value == nil {
+                       f.Value = &StringSlice{}
+               }
+               set.Var(f.Value, name, f.Usage)
+       })
+
+       return nil
+}
+
+// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter
+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
+       }
+       *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("%#v", *f)
+}
+
+// Value returns the slice of ints set by this flag
+func (f *IntSlice) Value() []int {
+       return *f
+}
+
+// Get returns the slice of ints set by this flag
+func (f *IntSlice) Get() interface{} {
+       return *f
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f IntSliceFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               newVal := &IntSlice{}
+                               for _, s := range strings.Split(envVal, ",") {
+                                       s = strings.TrimSpace(s)
+                                       if err := newVal.Set(s); err != nil {
+                                               return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err)
+                                       }
+                               }
+                               f.Value = newVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Value == nil {
+                       f.Value = &IntSlice{}
+               }
+               set.Var(f.Value, name, f.Usage)
+       })
+
+       return nil
+}
+
+// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter
+type Int64Slice []int64
+
+// Set parses the value into an integer and appends it to the list of values
+func (f *Int64Slice) Set(value string) error {
+       tmp, err := strconv.ParseInt(value, 10, 64)
+       if err != nil {
+               return err
+       }
+       *f = append(*f, tmp)
+       return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f *Int64Slice) String() string {
+       return fmt.Sprintf("%#v", *f)
+}
+
+// Value returns the slice of ints set by this flag
+func (f *Int64Slice) Value() []int64 {
+       return *f
+}
+
+// Get returns the slice of ints set by this flag
+func (f *Int64Slice) Get() interface{} {
+       return *f
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               newVal := &Int64Slice{}
+                               for _, s := range strings.Split(envVal, ",") {
+                                       s = strings.TrimSpace(s)
+                                       if err := newVal.Set(s); err != nil {
+                                               return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err)
+                                       }
+                               }
+                               f.Value = newVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Value == nil {
+                       f.Value = &Int64Slice{}
+               }
+               set.Var(f.Value, name, f.Usage)
+       })
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f BoolFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error {
+       val := false
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               if envVal == "" {
+                                       val = false
+                                       break
+                               }
+
+                               envValBool, err := strconv.ParseBool(envVal)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               val = envValBool
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.BoolVar(f.Destination, name, val, f.Usage)
+                       return
+               }
+               set.Bool(name, val, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f BoolTFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error {
+       val := true
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               if envVal == "" {
+                                       val = false
+                                       break
+                               }
+
+                               envValBool, err := strconv.ParseBool(envVal)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               val = envValBool
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.BoolVar(f.Destination, name, val, f.Usage)
+                       return
+               }
+               set.Bool(name, val, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f StringFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               f.Value = envVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.StringVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.String(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f IntFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValInt, err := strconv.ParseInt(envVal, 0, 64)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
+                               }
+                               f.Value = int(envValInt)
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.IntVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Int(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f Int64Flag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValInt, err := strconv.ParseInt(envVal, 0, 64)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               f.Value = envValInt
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.Int64Var(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Int64(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f UintFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f UintFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValInt, err := strconv.ParseUint(envVal, 0, 64)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               f.Value = uint(envValInt)
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.UintVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Uint(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f Uint64Flag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValInt, err := strconv.ParseUint(envVal, 0, 64)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               f.Value = uint64(envValInt)
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.Uint64Var(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Uint64(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f DurationFlag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValDuration, err := time.ParseDuration(envVal)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               f.Value = envValDuration
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.DurationVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Duration(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+// Apply populates the flag given the flag set and environment
+// Ignores errors
+func (f Float64Flag) Apply(set *flag.FlagSet) {
+       f.ApplyWithError(set)
+}
+
+// ApplyWithError populates the flag given the flag set and environment
+func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal, ok := syscall.Getenv(envVar); ok {
+                               envValFloat, err := strconv.ParseFloat(envVal, 10)
+                               if err != nil {
+                                       return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err)
+                               }
+
+                               f.Value = float64(envValFloat)
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.Float64Var(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Float64(name, f.Value, f.Usage)
+       })
+
+       return nil
+}
+
+func visibleFlags(fl []Flag) []Flag {
+       visible := []Flag{}
+       for _, flag := range fl {
+               field := flagValue(flag).FieldByName("Hidden")
+               if !field.IsValid() || !field.Bool() {
+                       visible = append(visible, flag)
+               }
+       }
+       return visible
+}
+
+func prefixFor(name string) (prefix string) {
+       if len(name) == 1 {
+               prefix = "-"
+       } else {
+               prefix = "--"
+       }
+
+       return
+}
+
+// Returns the placeholder, if any, and the unquoted usage string.
+func unquoteUsage(usage string) (string, string) {
+       for i := 0; i < len(usage); i++ {
+               if usage[i] == '`' {
+                       for j := i + 1; j < len(usage); j++ {
+                               if usage[j] == '`' {
+                                       name := usage[i+1 : j]
+                                       usage = usage[:i] + name + usage[j+1:]
+                                       return name, usage
+                               }
+                       }
+                       break
+               }
+       }
+       return "", usage
+}
+
+func prefixedNames(fullName, placeholder string) string {
+       var prefixed string
+       parts := strings.Split(fullName, ",")
+       for i, name := range parts {
+               name = strings.Trim(name, " ")
+               prefixed += prefixFor(name) + name
+               if placeholder != "" {
+                       prefixed += " " + placeholder
+               }
+               if i < len(parts)-1 {
+                       prefixed += ", "
+               }
+       }
+       return prefixed
+}
+
+func withEnvHint(envVar, str string) string {
+       envText := ""
+       if envVar != "" {
+               prefix := "$"
+               suffix := ""
+               sep := ", $"
+               if runtime.GOOS == "windows" {
+                       prefix = "%"
+                       suffix = "%"
+                       sep = "%, %"
+               }
+               envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix)
+       }
+       return str + envText
+}
+
+func flagValue(f Flag) reflect.Value {
+       fv := reflect.ValueOf(f)
+       for fv.Kind() == reflect.Ptr {
+               fv = reflect.Indirect(fv)
+       }
+       return fv
+}
+
+func stringifyFlag(f Flag) string {
+       fv := flagValue(f)
+
+       switch f.(type) {
+       case IntSliceFlag:
+               return withEnvHint(fv.FieldByName("EnvVar").String(),
+                       stringifyIntSliceFlag(f.(IntSliceFlag)))
+       case Int64SliceFlag:
+               return withEnvHint(fv.FieldByName("EnvVar").String(),
+                       stringifyInt64SliceFlag(f.(Int64SliceFlag)))
+       case StringSliceFlag:
+               return withEnvHint(fv.FieldByName("EnvVar").String(),
+                       stringifyStringSliceFlag(f.(StringSliceFlag)))
+       }
+
+       placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String())
+
+       needsPlaceholder := false
+       defaultValueString := ""
+
+       if val := fv.FieldByName("Value"); val.IsValid() {
+               needsPlaceholder = true
+               defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
+
+               if val.Kind() == reflect.String && val.String() != "" {
+                       defaultValueString = fmt.Sprintf(" (default: %q)", val.String())
+               }
+       }
+
+       if defaultValueString == " (default: )" {
+               defaultValueString = ""
+       }
+
+       if needsPlaceholder && placeholder == "" {
+               placeholder = defaultPlaceholder
+       }
+
+       usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString))
+
+       return withEnvHint(fv.FieldByName("EnvVar").String(),
+               fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault))
+}
+
+func stringifyIntSliceFlag(f IntSliceFlag) string {
+       defaultVals := []string{}
+       if f.Value != nil && len(f.Value.Value()) > 0 {
+               for _, i := range f.Value.Value() {
+                       defaultVals = append(defaultVals, fmt.Sprintf("%d", i))
+               }
+       }
+
+       return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+}
+
+func stringifyInt64SliceFlag(f Int64SliceFlag) string {
+       defaultVals := []string{}
+       if f.Value != nil && len(f.Value.Value()) > 0 {
+               for _, i := range f.Value.Value() {
+                       defaultVals = append(defaultVals, fmt.Sprintf("%d", i))
+               }
+       }
+
+       return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+}
+
+func stringifyStringSliceFlag(f StringSliceFlag) string {
+       defaultVals := []string{}
+       if f.Value != nil && len(f.Value.Value()) > 0 {
+               for _, s := range f.Value.Value() {
+                       if len(s) > 0 {
+                               defaultVals = append(defaultVals, fmt.Sprintf("%q", s))
+                       }
+               }
+       }
+
+       return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+}
+
+func stringifySliceFlag(usage, name string, defaultVals []string) string {
+       placeholder, usage := unquoteUsage(usage)
+       if placeholder == "" {
+               placeholder = defaultPlaceholder
+       }
+
+       defaultVal := ""
+       if len(defaultVals) > 0 {
+               defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", "))
+       }
+
+       usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal))
+       return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault)
+}
diff --git a/vendor/github.com/urfave/cli/flag_generated.go b/vendor/github.com/urfave/cli/flag_generated.go
new file mode 100644 (file)
index 0000000..491b619
--- /dev/null
@@ -0,0 +1,627 @@
+package cli
+
+import (
+       "flag"
+       "strconv"
+       "time"
+)
+
+// WARNING: This file is generated!
+
+// BoolFlag is a flag with type bool
+type BoolFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Destination *bool
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f BoolFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f BoolFlag) GetName() string {
+       return f.Name
+}
+
+// Bool looks up the value of a local BoolFlag, returns
+// false if not found
+func (c *Context) Bool(name string) bool {
+       return lookupBool(name, c.flagSet)
+}
+
+// GlobalBool looks up the value of a global BoolFlag, returns
+// false if not found
+func (c *Context) GlobalBool(name string) bool {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupBool(name, fs)
+       }
+       return false
+}
+
+func lookupBool(name string, set *flag.FlagSet) bool {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseBool(f.Value.String())
+               if err != nil {
+                       return false
+               }
+               return parsed
+       }
+       return false
+}
+
+// BoolTFlag is a flag with type bool that is true by default
+type BoolTFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Destination *bool
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f BoolTFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f BoolTFlag) GetName() string {
+       return f.Name
+}
+
+// BoolT looks up the value of a local BoolTFlag, returns
+// false if not found
+func (c *Context) BoolT(name string) bool {
+       return lookupBoolT(name, c.flagSet)
+}
+
+// GlobalBoolT looks up the value of a global BoolTFlag, returns
+// false if not found
+func (c *Context) GlobalBoolT(name string) bool {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupBoolT(name, fs)
+       }
+       return false
+}
+
+func lookupBoolT(name string, set *flag.FlagSet) bool {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseBool(f.Value.String())
+               if err != nil {
+                       return false
+               }
+               return parsed
+       }
+       return false
+}
+
+// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration)
+type DurationFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       time.Duration
+       Destination *time.Duration
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f DurationFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f DurationFlag) GetName() string {
+       return f.Name
+}
+
+// Duration looks up the value of a local DurationFlag, returns
+// 0 if not found
+func (c *Context) Duration(name string) time.Duration {
+       return lookupDuration(name, c.flagSet)
+}
+
+// GlobalDuration looks up the value of a global DurationFlag, returns
+// 0 if not found
+func (c *Context) GlobalDuration(name string) time.Duration {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupDuration(name, fs)
+       }
+       return 0
+}
+
+func lookupDuration(name string, set *flag.FlagSet) time.Duration {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := time.ParseDuration(f.Value.String())
+               if err != nil {
+                       return 0
+               }
+               return parsed
+       }
+       return 0
+}
+
+// Float64Flag is a flag with type float64
+type Float64Flag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       float64
+       Destination *float64
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f Float64Flag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f Float64Flag) GetName() string {
+       return f.Name
+}
+
+// Float64 looks up the value of a local Float64Flag, returns
+// 0 if not found
+func (c *Context) Float64(name string) float64 {
+       return lookupFloat64(name, c.flagSet)
+}
+
+// GlobalFloat64 looks up the value of a global Float64Flag, returns
+// 0 if not found
+func (c *Context) GlobalFloat64(name string) float64 {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupFloat64(name, fs)
+       }
+       return 0
+}
+
+func lookupFloat64(name string, set *flag.FlagSet) float64 {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseFloat(f.Value.String(), 64)
+               if err != nil {
+                       return 0
+               }
+               return parsed
+       }
+       return 0
+}
+
+// GenericFlag is a flag with type Generic
+type GenericFlag struct {
+       Name   string
+       Usage  string
+       EnvVar string
+       Hidden bool
+       Value  Generic
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f GenericFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f GenericFlag) GetName() string {
+       return f.Name
+}
+
+// Generic looks up the value of a local GenericFlag, returns
+// nil if not found
+func (c *Context) Generic(name string) interface{} {
+       return lookupGeneric(name, c.flagSet)
+}
+
+// GlobalGeneric looks up the value of a global GenericFlag, returns
+// nil if not found
+func (c *Context) GlobalGeneric(name string) interface{} {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupGeneric(name, fs)
+       }
+       return nil
+}
+
+func lookupGeneric(name string, set *flag.FlagSet) interface{} {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := f.Value, error(nil)
+               if err != nil {
+                       return nil
+               }
+               return parsed
+       }
+       return nil
+}
+
+// Int64Flag is a flag with type int64
+type Int64Flag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       int64
+       Destination *int64
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f Int64Flag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f Int64Flag) GetName() string {
+       return f.Name
+}
+
+// Int64 looks up the value of a local Int64Flag, returns
+// 0 if not found
+func (c *Context) Int64(name string) int64 {
+       return lookupInt64(name, c.flagSet)
+}
+
+// GlobalInt64 looks up the value of a global Int64Flag, returns
+// 0 if not found
+func (c *Context) GlobalInt64(name string) int64 {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupInt64(name, fs)
+       }
+       return 0
+}
+
+func lookupInt64(name string, set *flag.FlagSet) int64 {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseInt(f.Value.String(), 0, 64)
+               if err != nil {
+                       return 0
+               }
+               return parsed
+       }
+       return 0
+}
+
+// IntFlag is a flag with type int
+type IntFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       int
+       Destination *int
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f IntFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f IntFlag) GetName() string {
+       return f.Name
+}
+
+// Int looks up the value of a local IntFlag, returns
+// 0 if not found
+func (c *Context) Int(name string) int {
+       return lookupInt(name, c.flagSet)
+}
+
+// GlobalInt looks up the value of a global IntFlag, returns
+// 0 if not found
+func (c *Context) GlobalInt(name string) int {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupInt(name, fs)
+       }
+       return 0
+}
+
+func lookupInt(name string, set *flag.FlagSet) int {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseInt(f.Value.String(), 0, 64)
+               if err != nil {
+                       return 0
+               }
+               return int(parsed)
+       }
+       return 0
+}
+
+// IntSliceFlag is a flag with type *IntSlice
+type IntSliceFlag struct {
+       Name   string
+       Usage  string
+       EnvVar string
+       Hidden bool
+       Value  *IntSlice
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f IntSliceFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f IntSliceFlag) GetName() string {
+       return f.Name
+}
+
+// IntSlice looks up the value of a local IntSliceFlag, returns
+// nil if not found
+func (c *Context) IntSlice(name string) []int {
+       return lookupIntSlice(name, c.flagSet)
+}
+
+// GlobalIntSlice looks up the value of a global IntSliceFlag, returns
+// nil if not found
+func (c *Context) GlobalIntSlice(name string) []int {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupIntSlice(name, fs)
+       }
+       return nil
+}
+
+func lookupIntSlice(name string, set *flag.FlagSet) []int {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := (f.Value.(*IntSlice)).Value(), error(nil)
+               if err != nil {
+                       return nil
+               }
+               return parsed
+       }
+       return nil
+}
+
+// Int64SliceFlag is a flag with type *Int64Slice
+type Int64SliceFlag struct {
+       Name   string
+       Usage  string
+       EnvVar string
+       Hidden bool
+       Value  *Int64Slice
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f Int64SliceFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f Int64SliceFlag) GetName() string {
+       return f.Name
+}
+
+// Int64Slice looks up the value of a local Int64SliceFlag, returns
+// nil if not found
+func (c *Context) Int64Slice(name string) []int64 {
+       return lookupInt64Slice(name, c.flagSet)
+}
+
+// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns
+// nil if not found
+func (c *Context) GlobalInt64Slice(name string) []int64 {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupInt64Slice(name, fs)
+       }
+       return nil
+}
+
+func lookupInt64Slice(name string, set *flag.FlagSet) []int64 {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)
+               if err != nil {
+                       return nil
+               }
+               return parsed
+       }
+       return nil
+}
+
+// StringFlag is a flag with type string
+type StringFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       string
+       Destination *string
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f StringFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f StringFlag) GetName() string {
+       return f.Name
+}
+
+// String looks up the value of a local StringFlag, returns
+// "" if not found
+func (c *Context) String(name string) string {
+       return lookupString(name, c.flagSet)
+}
+
+// GlobalString looks up the value of a global StringFlag, returns
+// "" if not found
+func (c *Context) GlobalString(name string) string {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupString(name, fs)
+       }
+       return ""
+}
+
+func lookupString(name string, set *flag.FlagSet) string {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := f.Value.String(), error(nil)
+               if err != nil {
+                       return ""
+               }
+               return parsed
+       }
+       return ""
+}
+
+// StringSliceFlag is a flag with type *StringSlice
+type StringSliceFlag struct {
+       Name   string
+       Usage  string
+       EnvVar string
+       Hidden bool
+       Value  *StringSlice
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f StringSliceFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f StringSliceFlag) GetName() string {
+       return f.Name
+}
+
+// StringSlice looks up the value of a local StringSliceFlag, returns
+// nil if not found
+func (c *Context) StringSlice(name string) []string {
+       return lookupStringSlice(name, c.flagSet)
+}
+
+// GlobalStringSlice looks up the value of a global StringSliceFlag, returns
+// nil if not found
+func (c *Context) GlobalStringSlice(name string) []string {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupStringSlice(name, fs)
+       }
+       return nil
+}
+
+func lookupStringSlice(name string, set *flag.FlagSet) []string {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := (f.Value.(*StringSlice)).Value(), error(nil)
+               if err != nil {
+                       return nil
+               }
+               return parsed
+       }
+       return nil
+}
+
+// Uint64Flag is a flag with type uint64
+type Uint64Flag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       uint64
+       Destination *uint64
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f Uint64Flag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f Uint64Flag) GetName() string {
+       return f.Name
+}
+
+// Uint64 looks up the value of a local Uint64Flag, returns
+// 0 if not found
+func (c *Context) Uint64(name string) uint64 {
+       return lookupUint64(name, c.flagSet)
+}
+
+// GlobalUint64 looks up the value of a global Uint64Flag, returns
+// 0 if not found
+func (c *Context) GlobalUint64(name string) uint64 {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupUint64(name, fs)
+       }
+       return 0
+}
+
+func lookupUint64(name string, set *flag.FlagSet) uint64 {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseUint(f.Value.String(), 0, 64)
+               if err != nil {
+                       return 0
+               }
+               return parsed
+       }
+       return 0
+}
+
+// UintFlag is a flag with type uint
+type UintFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Hidden      bool
+       Value       uint
+       Destination *uint
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f UintFlag) String() string {
+       return FlagStringer(f)
+}
+
+// GetName returns the name of the flag
+func (f UintFlag) GetName() string {
+       return f.Name
+}
+
+// Uint looks up the value of a local UintFlag, returns
+// 0 if not found
+func (c *Context) Uint(name string) uint {
+       return lookupUint(name, c.flagSet)
+}
+
+// GlobalUint looks up the value of a global UintFlag, returns
+// 0 if not found
+func (c *Context) GlobalUint(name string) uint {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupUint(name, fs)
+       }
+       return 0
+}
+
+func lookupUint(name string, set *flag.FlagSet) uint {
+       f := set.Lookup(name)
+       if f != nil {
+               parsed, err := strconv.ParseUint(f.Value.String(), 0, 64)
+               if err != nil {
+                       return 0
+               }
+               return uint(parsed)
+       }
+       return 0
+}
diff --git a/vendor/github.com/urfave/cli/funcs.go b/vendor/github.com/urfave/cli/funcs.go
new file mode 100644 (file)
index 0000000..cba5e6c
--- /dev/null
@@ -0,0 +1,28 @@
+package cli
+
+// BashCompleteFunc is an action to execute when the bash-completion flag is set
+type BashCompleteFunc func(*Context)
+
+// BeforeFunc is 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
+type BeforeFunc func(*Context) error
+
+// AfterFunc is an action to execute after any subcommands are run, but after the
+// subcommand has finished it is run even if Action() panics
+type AfterFunc func(*Context) error
+
+// ActionFunc is the action to execute when no subcommands are specified
+type ActionFunc func(*Context) error
+
+// CommandNotFoundFunc is executed if the proper command cannot be found
+type CommandNotFoundFunc func(*Context, string)
+
+// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying
+// customized usage error messages.  This function is able to replace the
+// original error messages.  If this function is not set, the "Incorrect usage"
+// is displayed and the execution is interrupted.
+type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error
+
+// FlagStringFunc is used by the help generation to display a flag, which is
+// expected to be a single line.
+type FlagStringFunc func(Flag) string
diff --git a/vendor/github.com/urfave/cli/generate-flag-types b/vendor/github.com/urfave/cli/generate-flag-types
new file mode 100755 (executable)
index 0000000..7147381
--- /dev/null
@@ -0,0 +1,255 @@
+#!/usr/bin/env python
+"""
+The flag types that ship with the cli library have many things in common, and
+so we can take advantage of the `go generate` command to create much of the
+source code from a list of definitions.  These definitions attempt to cover
+the parts that vary between flag types, and should evolve as needed.
+
+An example of the minimum definition needed is:
+
+    {
+      "name": "SomeType",
+      "type": "sometype",
+      "context_default": "nil"
+    }
+
+In this example, the code generated for the `cli` package will include a type
+named `SomeTypeFlag` that is expected to wrap a value of type `sometype`.
+Fetching values by name via `*cli.Context` will default to a value of `nil`.
+
+A more complete, albeit somewhat redundant, example showing all available
+definition keys is:
+
+    {
+      "name": "VeryMuchType",
+      "type": "*VeryMuchType",
+      "value": true,
+      "dest": false,
+      "doctail": " which really only wraps a []float64, oh well!",
+      "context_type": "[]float64",
+      "context_default": "nil",
+      "parser": "parseVeryMuchType(f.Value.String())",
+      "parser_cast": "[]float64(parsed)"
+    }
+
+The meaning of each field is as follows:
+
+               name (string) - The type "name", which will be suffixed with
+                               `Flag` when generating the type definition
+                               for `cli` and the wrapper type for `altsrc`
+               type (string) - The type that the generated `Flag` type for `cli`
+                               is expected to "contain" as its `.Value` member
+                value (bool) - Should the generated `cli` type have a `Value`
+                               member?
+                 dest (bool) - Should the generated `cli` type support a
+                               destination pointer?
+            doctail (string) - Additional docs for the `cli` flag type comment
+       context_type (string) - The literal type used in the `*cli.Context`
+                               reader func signature
+    context_default (string) - The literal value used as the default by the
+                               `*cli.Context` reader funcs when no value is
+                               present
+             parser (string) - Literal code used to parse the flag `f`,
+                               expected to have a return signature of
+                               (value, error)
+        parser_cast (string) - Literal code used to cast the `parsed` value
+                               returned from the `parser` code
+"""
+
+from __future__ import print_function, unicode_literals
+
+import argparse
+import json
+import os
+import subprocess
+import sys
+import tempfile
+import textwrap
+
+
+class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter,
+                      argparse.RawDescriptionHelpFormatter):
+    pass
+
+
+def main(sysargs=sys.argv[:]):
+    parser = argparse.ArgumentParser(
+        description='Generate flag type code!',
+        formatter_class=_FancyFormatter)
+    parser.add_argument(
+        'package',
+        type=str, default='cli', choices=_WRITEFUNCS.keys(),
+        help='Package for which flag types will be generated'
+    )
+    parser.add_argument(
+        '-i', '--in-json',
+        type=argparse.FileType('r'),
+        default=sys.stdin,
+        help='Input JSON file which defines each type to be generated'
+    )
+    parser.add_argument(
+        '-o', '--out-go',
+        type=argparse.FileType('w'),
+        default=sys.stdout,
+        help='Output file/stream to which generated source will be written'
+    )
+    parser.epilog = __doc__
+
+    args = parser.parse_args(sysargs[1:])
+    _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json)
+    return 0
+
+
+def _generate_flag_types(writefunc, output_go, input_json):
+    types = json.load(input_json)
+
+    tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False)
+    writefunc(tmp, types)
+    tmp.close()
+
+    new_content = subprocess.check_output(
+        ['goimports', tmp.name]
+    ).decode('utf-8')
+
+    print(new_content, file=output_go, end='')
+    output_go.flush()
+    os.remove(tmp.name)
+
+
+def _set_typedef_defaults(typedef):
+    typedef.setdefault('doctail', '')
+    typedef.setdefault('context_type', typedef['type'])
+    typedef.setdefault('dest', True)
+    typedef.setdefault('value', True)
+    typedef.setdefault('parser', 'f.Value, error(nil)')
+    typedef.setdefault('parser_cast', 'parsed')
+
+
+def _write_cli_flag_types(outfile, types):
+    _fwrite(outfile, """\
+        package cli
+
+        // WARNING: This file is generated!
+
+        """)
+
+    for typedef in types:
+        _set_typedef_defaults(typedef)
+
+        _fwrite(outfile, """\
+        // {name}Flag is a flag with type {type}{doctail}
+        type {name}Flag struct {{
+            Name string
+            Usage string
+            EnvVar string
+            Hidden bool
+        """.format(**typedef))
+
+        if typedef['value']:
+            _fwrite(outfile, """\
+            Value {type}
+            """.format(**typedef))
+
+        if typedef['dest']:
+            _fwrite(outfile, """\
+            Destination *{type}
+            """.format(**typedef))
+
+        _fwrite(outfile, "\n}\n\n")
+
+        _fwrite(outfile, """\
+            // String returns a readable representation of this value
+            // (for usage defaults)
+            func (f {name}Flag) String() string {{
+                return FlagStringer(f)
+            }}
+
+            // GetName returns the name of the flag
+            func (f {name}Flag) GetName() string {{
+                return f.Name
+            }}
+
+            // {name} looks up the value of a local {name}Flag, returns
+            // {context_default} if not found
+            func (c *Context) {name}(name string) {context_type} {{
+                return lookup{name}(name, c.flagSet)
+            }}
+
+            // Global{name} looks up the value of a global {name}Flag, returns
+            // {context_default} if not found
+            func (c *Context) Global{name}(name string) {context_type} {{
+                if fs := lookupGlobalFlagSet(name, c); fs != nil {{
+                    return lookup{name}(name, fs)
+                }}
+                return {context_default}
+            }}
+
+            func lookup{name}(name string, set *flag.FlagSet) {context_type} {{
+                f := set.Lookup(name)
+                if f != nil {{
+                    parsed, err := {parser}
+                    if err != nil {{
+                        return {context_default}
+                    }}
+                    return {parser_cast}
+                }}
+                return {context_default}
+            }}
+            """.format(**typedef))
+
+
+def _write_altsrc_flag_types(outfile, types):
+    _fwrite(outfile, """\
+        package altsrc
+
+        import (
+            "gopkg.in/urfave/cli.v1"
+        )
+
+        // WARNING: This file is generated!
+
+        """)
+
+    for typedef in types:
+        _set_typedef_defaults(typedef)
+
+        _fwrite(outfile, """\
+        // {name}Flag is the flag type that wraps cli.{name}Flag to allow
+        // for other values to be specified
+        type {name}Flag struct {{
+            cli.{name}Flag
+            set *flag.FlagSet
+        }}
+
+        // New{name}Flag creates a new {name}Flag
+        func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{
+            return &{name}Flag{{{name}Flag: fl, set: nil}}
+        }}
+
+        // Apply saves the flagSet for later usage calls, then calls the
+        // wrapped {name}Flag.Apply
+        func (f *{name}Flag) Apply(set *flag.FlagSet) {{
+            f.set = set
+            f.{name}Flag.Apply(set)
+        }}
+
+        // ApplyWithError saves the flagSet for later usage calls, then calls the
+        // wrapped {name}Flag.ApplyWithError
+        func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{
+            f.set = set
+            return f.{name}Flag.ApplyWithError(set)
+        }}
+        """.format(**typedef))
+
+
+def _fwrite(outfile, text):
+    print(textwrap.dedent(text), end='', file=outfile)
+
+
+_WRITEFUNCS = {
+    'cli': _write_cli_flag_types,
+    'altsrc': _write_altsrc_flag_types
+}
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/vendor/github.com/urfave/cli/help.go b/vendor/github.com/urfave/cli/help.go
new file mode 100644 (file)
index 0000000..df4cb56
--- /dev/null
@@ -0,0 +1,294 @@
+package cli
+
+import (
+       "fmt"
+       "io"
+       "os"
+       "strings"
+       "text/tabwriter"
+       "text/template"
+)
+
+// AppHelpTemplate is 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}}{{if .Usage}} - {{.Usage}}{{end}}
+
+USAGE:
+   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
+
+VERSION:
+   {{.Version}}{{end}}{{end}}{{if .Description}}
+
+DESCRIPTION:
+   {{.Description}}{{end}}{{if len .Authors}}
+
+AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
+   {{range $index, $author := .Authors}}{{if $index}}
+   {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
+
+COMMANDS:{{range .VisibleCategories}}{{if .Name}}
+   {{.Name}}:{{end}}{{range .VisibleCommands}}
+     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
+
+GLOBAL OPTIONS:
+   {{range $index, $option := .VisibleFlags}}{{if $index}}
+   {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}}
+
+COPYRIGHT:
+   {{.Copyright}}{{end}}
+`
+
+// CommandHelpTemplate is 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:
+   {{.HelpName}} - {{.Usage}}
+
+USAGE:
+   {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}}
+
+CATEGORY:
+   {{.Category}}{{end}}{{if .Description}}
+
+DESCRIPTION:
+   {{.Description}}{{end}}{{if .VisibleFlags}}
+
+OPTIONS:
+   {{range .VisibleFlags}}{{.}}
+   {{end}}{{end}}
+`
+
+// SubcommandHelpTemplate is 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:
+   {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}}
+
+USAGE:
+   {{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
+
+COMMANDS:{{range .VisibleCategories}}{{if .Name}}
+   {{.Name}}:{{end}}{{range .VisibleCommands}}
+     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}
+{{end}}{{if .VisibleFlags}}
+OPTIONS:
+   {{range .VisibleFlags}}{{.}}
+   {{end}}{{end}}
+`
+
+var helpCommand = Command{
+       Name:      "help",
+       Aliases:   []string{"h"},
+       Usage:     "Shows a list of commands or help for one command",
+       ArgsUsage: "[command]",
+       Action: func(c *Context) error {
+               args := c.Args()
+               if args.Present() {
+                       return ShowCommandHelp(c, args.First())
+               }
+
+               ShowAppHelp(c)
+               return nil
+       },
+}
+
+var helpSubcommand = Command{
+       Name:      "help",
+       Aliases:   []string{"h"},
+       Usage:     "Shows a list of commands or help for one command",
+       ArgsUsage: "[command]",
+       Action: func(c *Context) error {
+               args := c.Args()
+               if args.Present() {
+                       return ShowCommandHelp(c, args.First())
+               }
+
+               return ShowSubcommandHelp(c)
+       },
+}
+
+// Prints help for the App or Command
+type helpPrinter func(w io.Writer, templ string, data interface{})
+
+// HelpPrinter is a function that writes the help output. If not set a default
+// is used. The function signature is:
+// func(w io.Writer, templ string, data interface{})
+var HelpPrinter helpPrinter = printHelp
+
+// VersionPrinter prints the version for the App
+var VersionPrinter = printVersion
+
+// ShowAppHelp is an action that displays the help.
+func ShowAppHelp(c *Context) error {
+       HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
+       return nil
+}
+
+// DefaultAppComplete prints the list of subcommands as the default app completion method
+func DefaultAppComplete(c *Context) {
+       for _, command := range c.App.Commands {
+               if command.Hidden {
+                       continue
+               }
+               for _, name := range command.Names() {
+                       fmt.Fprintln(c.App.Writer, name)
+               }
+       }
+}
+
+// ShowCommandHelp prints help for the given command
+func ShowCommandHelp(ctx *Context, command string) error {
+       // show the subcommand help for a command with subcommands
+       if command == "" {
+               HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App)
+               return nil
+       }
+
+       for _, c := range ctx.App.Commands {
+               if c.HasName(command) {
+                       HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
+                       return nil
+               }
+       }
+
+       if ctx.App.CommandNotFound == nil {
+               return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3)
+       }
+
+       ctx.App.CommandNotFound(ctx, command)
+       return nil
+}
+
+// ShowSubcommandHelp prints help for the given subcommand
+func ShowSubcommandHelp(c *Context) error {
+       return ShowCommandHelp(c, c.Command.Name)
+}
+
+// ShowVersion 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)
+}
+
+// ShowCompletions 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)
+       }
+}
+
+// ShowCommandCompletions 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, 1, 8, 2, ' ', 0)
+       t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
+       err := t.Execute(w, data)
+       if err != nil {
+               // If the writer is closed, t.Execute will fail, and there's nothing
+               // we can do to recover.
+               if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" {
+                       fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err)
+               }
+               return
+       }
+       w.Flush()
+}
+
+func checkVersion(c *Context) bool {
+       found := false
+       if VersionFlag.GetName() != "" {
+               eachName(VersionFlag.GetName(), func(name string) {
+                       if c.GlobalBool(name) || c.Bool(name) {
+                               found = true
+                       }
+               })
+       }
+       return found
+}
+
+func checkHelp(c *Context) bool {
+       found := false
+       if HelpFlag.GetName() != "" {
+               eachName(HelpFlag.GetName(), func(name string) {
+                       if c.GlobalBool(name) || c.Bool(name) {
+                               found = true
+                       }
+               })
+       }
+       return found
+}
+
+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.Bool("h") || c.Bool("help") {
+               ShowSubcommandHelp(c)
+               return true
+       }
+
+       return false
+}
+
+func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) {
+       if !a.EnableBashCompletion {
+               return false, arguments
+       }
+
+       pos := len(arguments) - 1
+       lastArg := arguments[pos]
+
+       if lastArg != "--"+BashCompletionFlag.GetName() {
+               return false, arguments
+       }
+
+       return true, arguments[:pos]
+}
+
+func checkCompletions(c *Context) bool {
+       if !c.shellComplete {
+               return false
+       }
+
+       if args := c.Args(); args.Present() {
+               name := args.First()
+               if cmd := c.App.Command(name); cmd != nil {
+                       // let the command handle the completion
+                       return false
+               }
+       }
+
+       ShowCompletions(c)
+       return true
+}
+
+func checkCommandCompletions(c *Context, name string) bool {
+       if !c.shellComplete {
+               return false
+       }
+
+       ShowCommandCompletions(c, name)
+       return true
+}
diff --git a/vendor/github.com/urfave/cli/runtests b/vendor/github.com/urfave/cli/runtests
new file mode 100755 (executable)
index 0000000..ee22bde
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+from __future__ import print_function
+
+import argparse
+import os
+import sys
+import tempfile
+
+from subprocess import check_call, check_output
+
+
+PACKAGE_NAME = os.environ.get(
+    'CLI_PACKAGE_NAME', 'github.com/urfave/cli'
+)
+
+
+def main(sysargs=sys.argv[:]):
+    targets = {
+        'vet': _vet,
+        'test': _test,
+        'gfmrun': _gfmrun,
+        'toc': _toc,
+        'gen': _gen,
+    }
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        'target', nargs='?', choices=tuple(targets.keys()), default='test'
+    )
+    args = parser.parse_args(sysargs[1:])
+
+    targets[args.target]()
+    return 0
+
+
+def _test():
+    if check_output('go version'.split()).split()[2] < 'go1.2':
+        _run('go test -v .')
+        return
+
+    coverprofiles = []
+    for subpackage in ['', 'altsrc']:
+        coverprofile = 'cli.coverprofile'
+        if subpackage != '':
+            coverprofile = '{}.coverprofile'.format(subpackage)
+
+        coverprofiles.append(coverprofile)
+
+        _run('go test -v'.split() + [
+            '-coverprofile={}'.format(coverprofile),
+            ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/')
+        ])
+
+    combined_name = _combine_coverprofiles(coverprofiles)
+    _run('go tool cover -func={}'.format(combined_name))
+    os.remove(combined_name)
+
+
+def _gfmrun():
+    go_version = check_output('go version'.split()).split()[2]
+    if go_version < 'go1.3':
+        print('runtests: skip on {}'.format(go_version), file=sys.stderr)
+        return
+    _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md'])
+
+
+def _vet():
+    _run('go vet ./...')
+
+
+def _toc():
+    _run('node_modules/.bin/markdown-toc -i README.md')
+    _run('git diff --exit-code')
+
+
+def _gen():
+    go_version = check_output('go version'.split()).split()[2]
+    if go_version < 'go1.5':
+        print('runtests: skip on {}'.format(go_version), file=sys.stderr)
+        return
+
+    _run('go generate ./...')
+    _run('git diff --exit-code')
+
+
+def _run(command):
+    if hasattr(command, 'split'):
+        command = command.split()
+    print('runtests: {}'.format(' '.join(command)), file=sys.stderr)
+    check_call(command)
+
+
+def _gfmrun_count():
+    with open('README.md') as infile:
+        lines = infile.read().splitlines()
+        return len(filter(_is_go_runnable, lines))
+
+
+def _is_go_runnable(line):
+    return line.startswith('package main')
+
+
+def _combine_coverprofiles(coverprofiles):
+    combined = tempfile.NamedTemporaryFile(
+        suffix='.coverprofile', delete=False
+    )
+    combined.write('mode: set\n')
+
+    for coverprofile in coverprofiles:
+        with open(coverprofile, 'r') as infile:
+            for line in infile.readlines():
+                if not line.startswith('mode: '):
+                    combined.write(line)
+
+    combined.flush()
+    name = combined.name
+    combined.close()
+    return name
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go
new file mode 100644 (file)
index 0000000..18379a9
--- /dev/null
@@ -0,0 +1,951 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package terminal
+
+import (
+       "bytes"
+       "io"
+       "sync"
+       "unicode/utf8"
+)
+
+// EscapeCodes contains escape sequences that can be written to the terminal in
+// order to achieve different styles of text.
+type EscapeCodes struct {
+       // Foreground colors
+       Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
+
+       // Reset all attributes
+       Reset []byte
+}
+
+var vt100EscapeCodes = EscapeCodes{
+       Black:   []byte{keyEscape, '[', '3', '0', 'm'},
+       Red:     []byte{keyEscape, '[', '3', '1', 'm'},
+       Green:   []byte{keyEscape, '[', '3', '2', 'm'},
+       Yellow:  []byte{keyEscape, '[', '3', '3', 'm'},
+       Blue:    []byte{keyEscape, '[', '3', '4', 'm'},
+       Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
+       Cyan:    []byte{keyEscape, '[', '3', '6', 'm'},
+       White:   []byte{keyEscape, '[', '3', '7', 'm'},
+
+       Reset: []byte{keyEscape, '[', '0', 'm'},
+}
+
+// Terminal contains the state for running a VT100 terminal that is capable of
+// reading lines of input.
+type Terminal struct {
+       // AutoCompleteCallback, if non-null, is called for each keypress with
+       // the full input line and the current position of the cursor (in
+       // bytes, as an index into |line|). If it returns ok=false, the key
+       // press is processed normally. Otherwise it returns a replacement line
+       // and the new cursor position.
+       AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
+
+       // Escape contains a pointer to the escape codes for this terminal.
+       // It's always a valid pointer, although the escape codes themselves
+       // may be empty if the terminal doesn't support them.
+       Escape *EscapeCodes
+
+       // lock protects the terminal and the state in this object from
+       // concurrent processing of a key press and a Write() call.
+       lock sync.Mutex
+
+       c      io.ReadWriter
+       prompt []rune
+
+       // line is the current line being entered.
+       line []rune
+       // pos is the logical position of the cursor in line
+       pos int
+       // echo is true if local echo is enabled
+       echo bool
+       // pasteActive is true iff there is a bracketed paste operation in
+       // progress.
+       pasteActive bool
+
+       // cursorX contains the current X value of the cursor where the left
+       // edge is 0. cursorY contains the row number where the first row of
+       // the current line is 0.
+       cursorX, cursorY int
+       // maxLine is the greatest value of cursorY so far.
+       maxLine int
+
+       termWidth, termHeight int
+
+       // outBuf contains the terminal data to be sent.
+       outBuf []byte
+       // remainder contains the remainder of any partial key sequences after
+       // a read. It aliases into inBuf.
+       remainder []byte
+       inBuf     [256]byte
+
+       // history contains previously entered commands so that they can be
+       // accessed with the up and down keys.
+       history stRingBuffer
+       // historyIndex stores the currently accessed history entry, where zero
+       // means the immediately previous entry.
+       historyIndex int
+       // When navigating up and down the history it's possible to return to
+       // the incomplete, initial line. That value is stored in
+       // historyPending.
+       historyPending string
+}
+
+// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
+// a local terminal, that terminal must first have been put into raw mode.
+// prompt is a string that is written at the start of each input line (i.e.
+// "> ").
+func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
+       return &Terminal{
+               Escape:       &vt100EscapeCodes,
+               c:            c,
+               prompt:       []rune(prompt),
+               termWidth:    80,
+               termHeight:   24,
+               echo:         true,
+               historyIndex: -1,
+       }
+}
+
+const (
+       keyCtrlD     = 4
+       keyCtrlU     = 21
+       keyEnter     = '\r'
+       keyEscape    = 27
+       keyBackspace = 127
+       keyUnknown   = 0xd800 /* UTF-16 surrogate area */ + iota
+       keyUp
+       keyDown
+       keyLeft
+       keyRight
+       keyAltLeft
+       keyAltRight
+       keyHome
+       keyEnd
+       keyDeleteWord
+       keyDeleteLine
+       keyClearScreen
+       keyPasteStart
+       keyPasteEnd
+)
+
+var (
+       crlf       = []byte{'\r', '\n'}
+       pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
+       pasteEnd   = []byte{keyEscape, '[', '2', '0', '1', '~'}
+)
+
+// bytesToKey tries to parse a key sequence from b. If successful, it returns
+// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
+func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
+       if len(b) == 0 {
+               return utf8.RuneError, nil
+       }
+
+       if !pasteActive {
+               switch b[0] {
+               case 1: // ^A
+                       return keyHome, b[1:]
+               case 5: // ^E
+                       return keyEnd, b[1:]
+               case 8: // ^H
+                       return keyBackspace, b[1:]
+               case 11: // ^K
+                       return keyDeleteLine, b[1:]
+               case 12: // ^L
+                       return keyClearScreen, b[1:]
+               case 23: // ^W
+                       return keyDeleteWord, b[1:]
+               }
+       }
+
+       if b[0] != keyEscape {
+               if !utf8.FullRune(b) {
+                       return utf8.RuneError, b
+               }
+               r, l := utf8.DecodeRune(b)
+               return r, b[l:]
+       }
+
+       if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
+               switch b[2] {
+               case 'A':
+                       return keyUp, b[3:]
+               case 'B':
+                       return keyDown, b[3:]
+               case 'C':
+                       return keyRight, b[3:]
+               case 'D':
+                       return keyLeft, b[3:]
+               case 'H':
+                       return keyHome, b[3:]
+               case 'F':
+                       return keyEnd, b[3:]
+               }
+       }
+
+       if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
+               switch b[5] {
+               case 'C':
+                       return keyAltRight, b[6:]
+               case 'D':
+                       return keyAltLeft, b[6:]
+               }
+       }
+
+       if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
+               return keyPasteStart, b[6:]
+       }
+
+       if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
+               return keyPasteEnd, b[6:]
+       }
+
+       // If we get here then we have a key that we don't recognise, or a
+       // partial sequence. It's not clear how one should find the end of a
+       // sequence without knowing them all, but it seems that [a-zA-Z~] only
+       // appears at the end of a sequence.
+       for i, c := range b[0:] {
+               if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
+                       return keyUnknown, b[i+1:]
+               }
+       }
+
+       return utf8.RuneError, b
+}
+
+// queue appends data to the end of t.outBuf
+func (t *Terminal) queue(data []rune) {
+       t.outBuf = append(t.outBuf, []byte(string(data))...)
+}
+
+var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
+var space = []rune{' '}
+
+func isPrintable(key rune) bool {
+       isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
+       return key >= 32 && !isInSurrogateArea
+}
+
+// moveCursorToPos appends data to t.outBuf which will move the cursor to the
+// given, logical position in the text.
+func (t *Terminal) moveCursorToPos(pos int) {
+       if !t.echo {
+               return
+       }
+
+       x := visualLength(t.prompt) + pos
+       y := x / t.termWidth
+       x = x % t.termWidth
+
+       up := 0
+       if y < t.cursorY {
+               up = t.cursorY - y
+       }
+
+       down := 0
+       if y > t.cursorY {
+               down = y - t.cursorY
+       }
+
+       left := 0
+       if x < t.cursorX {
+               left = t.cursorX - x
+       }
+
+       right := 0
+       if x > t.cursorX {
+               right = x - t.cursorX
+       }
+
+       t.cursorX = x
+       t.cursorY = y
+       t.move(up, down, left, right)
+}
+
+func (t *Terminal) move(up, down, left, right int) {
+       movement := make([]rune, 3*(up+down+left+right))
+       m := movement
+       for i := 0; i < up; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'A'
+               m = m[3:]
+       }
+       for i := 0; i < down; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'B'
+               m = m[3:]
+       }
+       for i := 0; i < left; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'D'
+               m = m[3:]
+       }
+       for i := 0; i < right; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'C'
+               m = m[3:]
+       }
+
+       t.queue(movement)
+}
+
+func (t *Terminal) clearLineToRight() {
+       op := []rune{keyEscape, '[', 'K'}
+       t.queue(op)
+}
+
+const maxLineLength = 4096
+
+func (t *Terminal) setLine(newLine []rune, newPos int) {
+       if t.echo {
+               t.moveCursorToPos(0)
+               t.writeLine(newLine)
+               for i := len(newLine); i < len(t.line); i++ {
+                       t.writeLine(space)
+               }
+               t.moveCursorToPos(newPos)
+       }
+       t.line = newLine
+       t.pos = newPos
+}
+
+func (t *Terminal) advanceCursor(places int) {
+       t.cursorX += places
+       t.cursorY += t.cursorX / t.termWidth
+       if t.cursorY > t.maxLine {
+               t.maxLine = t.cursorY
+       }
+       t.cursorX = t.cursorX % t.termWidth
+
+       if places > 0 && t.cursorX == 0 {
+               // Normally terminals will advance the current position
+               // when writing a character. But that doesn't happen
+               // for the last character in a line. However, when
+               // writing a character (except a new line) that causes
+               // a line wrap, the position will be advanced two
+               // places.
+               //
+               // So, if we are stopping at the end of a line, we
+               // need to write a newline so that our cursor can be
+               // advanced to the next line.
+               t.outBuf = append(t.outBuf, '\r', '\n')
+       }
+}
+
+func (t *Terminal) eraseNPreviousChars(n int) {
+       if n == 0 {
+               return
+       }
+
+       if t.pos < n {
+               n = t.pos
+       }
+       t.pos -= n
+       t.moveCursorToPos(t.pos)
+
+       copy(t.line[t.pos:], t.line[n+t.pos:])
+       t.line = t.line[:len(t.line)-n]
+       if t.echo {
+               t.writeLine(t.line[t.pos:])
+               for i := 0; i < n; i++ {
+                       t.queue(space)
+               }
+               t.advanceCursor(n)
+               t.moveCursorToPos(t.pos)
+       }
+}
+
+// countToLeftWord returns then number of characters from the cursor to the
+// start of the previous word.
+func (t *Terminal) countToLeftWord() int {
+       if t.pos == 0 {
+               return 0
+       }
+
+       pos := t.pos - 1
+       for pos > 0 {
+               if t.line[pos] != ' ' {
+                       break
+               }
+               pos--
+       }
+       for pos > 0 {
+               if t.line[pos] == ' ' {
+                       pos++
+                       break
+               }
+               pos--
+       }
+
+       return t.pos - pos
+}
+
+// countToRightWord returns then number of characters from the cursor to the
+// start of the next word.
+func (t *Terminal) countToRightWord() int {
+       pos := t.pos
+       for pos < len(t.line) {
+               if t.line[pos] == ' ' {
+                       break
+               }
+               pos++
+       }
+       for pos < len(t.line) {
+               if t.line[pos] != ' ' {
+                       break
+               }
+               pos++
+       }
+       return pos - t.pos
+}
+
+// visualLength returns the number of visible glyphs in s.
+func visualLength(runes []rune) int {
+       inEscapeSeq := false
+       length := 0
+
+       for _, r := range runes {
+               switch {
+               case inEscapeSeq:
+                       if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
+                               inEscapeSeq = false
+                       }
+               case r == '\x1b':
+                       inEscapeSeq = true
+               default:
+                       length++
+               }
+       }
+
+       return length
+}
+
+// handleKey processes the given key and, optionally, returns a line of text
+// that the user has entered.
+func (t *Terminal) handleKey(key rune) (line string, ok bool) {
+       if t.pasteActive && key != keyEnter {
+               t.addKeyToLine(key)
+               return
+       }
+
+       switch key {
+       case keyBackspace:
+               if t.pos == 0 {
+                       return
+               }
+               t.eraseNPreviousChars(1)
+       case keyAltLeft:
+               // move left by a word.
+               t.pos -= t.countToLeftWord()
+               t.moveCursorToPos(t.pos)
+       case keyAltRight:
+               // move right by a word.
+               t.pos += t.countToRightWord()
+               t.moveCursorToPos(t.pos)
+       case keyLeft:
+               if t.pos == 0 {
+                       return
+               }
+               t.pos--
+               t.moveCursorToPos(t.pos)
+       case keyRight:
+               if t.pos == len(t.line) {
+                       return
+               }
+               t.pos++
+               t.moveCursorToPos(t.pos)
+       case keyHome:
+               if t.pos == 0 {
+                       return
+               }
+               t.pos = 0
+               t.moveCursorToPos(t.pos)
+       case keyEnd:
+               if t.pos == len(t.line) {
+                       return
+               }
+               t.pos = len(t.line)
+               t.moveCursorToPos(t.pos)
+       case keyUp:
+               entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
+               if !ok {
+                       return "", false
+               }
+               if t.historyIndex == -1 {
+                       t.historyPending = string(t.line)
+               }
+               t.historyIndex++
+               runes := []rune(entry)
+               t.setLine(runes, len(runes))
+       case keyDown:
+               switch t.historyIndex {
+               case -1:
+                       return
+               case 0:
+                       runes := []rune(t.historyPending)
+                       t.setLine(runes, len(runes))
+                       t.historyIndex--
+               default:
+                       entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)
+                       if ok {
+                               t.historyIndex--
+                               runes := []rune(entry)
+                               t.setLine(runes, len(runes))
+                       }
+               }
+       case keyEnter:
+               t.moveCursorToPos(len(t.line))
+               t.queue([]rune("\r\n"))
+               line = string(t.line)
+               ok = true
+               t.line = t.line[:0]
+               t.pos = 0
+               t.cursorX = 0
+               t.cursorY = 0
+               t.maxLine = 0
+       case keyDeleteWord:
+               // Delete zero or more spaces and then one or more characters.
+               t.eraseNPreviousChars(t.countToLeftWord())
+       case keyDeleteLine:
+               // Delete everything from the current cursor position to the
+               // end of line.
+               for i := t.pos; i < len(t.line); i++ {
+                       t.queue(space)
+                       t.advanceCursor(1)
+               }
+               t.line = t.line[:t.pos]
+               t.moveCursorToPos(t.pos)
+       case keyCtrlD:
+               // Erase the character under the current position.
+               // The EOF case when the line is empty is handled in
+               // readLine().
+               if t.pos < len(t.line) {
+                       t.pos++
+                       t.eraseNPreviousChars(1)
+               }
+       case keyCtrlU:
+               t.eraseNPreviousChars(t.pos)
+       case keyClearScreen:
+               // Erases the screen and moves the cursor to the home position.
+               t.queue([]rune("\x1b[2J\x1b[H"))
+               t.queue(t.prompt)
+               t.cursorX, t.cursorY = 0, 0
+               t.advanceCursor(visualLength(t.prompt))
+               t.setLine(t.line, t.pos)
+       default:
+               if t.AutoCompleteCallback != nil {
+                       prefix := string(t.line[:t.pos])
+                       suffix := string(t.line[t.pos:])
+
+                       t.lock.Unlock()
+                       newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
+                       t.lock.Lock()
+
+                       if completeOk {
+                               t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))
+                               return
+                       }
+               }
+               if !isPrintable(key) {
+                       return
+               }
+               if len(t.line) == maxLineLength {
+                       return
+               }
+               t.addKeyToLine(key)
+       }
+       return
+}
+
+// addKeyToLine inserts the given key at the current position in the current
+// line.
+func (t *Terminal) addKeyToLine(key rune) {
+       if len(t.line) == cap(t.line) {
+               newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
+               copy(newLine, t.line)
+               t.line = newLine
+       }
+       t.line = t.line[:len(t.line)+1]
+       copy(t.line[t.pos+1:], t.line[t.pos:])
+       t.line[t.pos] = key
+       if t.echo {
+               t.writeLine(t.line[t.pos:])
+       }
+       t.pos++
+       t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) writeLine(line []rune) {
+       for len(line) != 0 {
+               remainingOnLine := t.termWidth - t.cursorX
+               todo := len(line)
+               if todo > remainingOnLine {
+                       todo = remainingOnLine
+               }
+               t.queue(line[:todo])
+               t.advanceCursor(visualLength(line[:todo]))
+               line = line[todo:]
+       }
+}
+
+// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
+func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
+       for len(buf) > 0 {
+               i := bytes.IndexByte(buf, '\n')
+               todo := len(buf)
+               if i >= 0 {
+                       todo = i
+               }
+
+               var nn int
+               nn, err = w.Write(buf[:todo])
+               n += nn
+               if err != nil {
+                       return n, err
+               }
+               buf = buf[todo:]
+
+               if i >= 0 {
+                       if _, err = w.Write(crlf); err != nil {
+                               return n, err
+                       }
+                       n += 1
+                       buf = buf[1:]
+               }
+       }
+
+       return n, nil
+}
+
+func (t *Terminal) Write(buf []byte) (n int, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       if t.cursorX == 0 && t.cursorY == 0 {
+               // This is the easy case: there's nothing on the screen that we
+               // have to move out of the way.
+               return writeWithCRLF(t.c, buf)
+       }
+
+       // We have a prompt and possibly user input on the screen. We
+       // have to clear it first.
+       t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
+       t.cursorX = 0
+       t.clearLineToRight()
+
+       for t.cursorY > 0 {
+               t.move(1 /* up */, 0, 0, 0)
+               t.cursorY--
+               t.clearLineToRight()
+       }
+
+       if _, err = t.c.Write(t.outBuf); err != nil {
+               return
+       }
+       t.outBuf = t.outBuf[:0]
+
+       if n, err = writeWithCRLF(t.c, buf); err != nil {
+               return
+       }
+
+       t.writeLine(t.prompt)
+       if t.echo {
+               t.writeLine(t.line)
+       }
+
+       t.moveCursorToPos(t.pos)
+
+       if _, err = t.c.Write(t.outBuf); err != nil {
+               return
+       }
+       t.outBuf = t.outBuf[:0]
+       return
+}
+
+// ReadPassword temporarily changes the prompt and reads a password, without
+// echo, from the terminal.
+func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       oldPrompt := t.prompt
+       t.prompt = []rune(prompt)
+       t.echo = false
+
+       line, err = t.readLine()
+
+       t.prompt = oldPrompt
+       t.echo = true
+
+       return
+}
+
+// ReadLine returns a line of input from the terminal.
+func (t *Terminal) ReadLine() (line string, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       return t.readLine()
+}
+
+func (t *Terminal) readLine() (line string, err error) {
+       // t.lock must be held at this point
+
+       if t.cursorX == 0 && t.cursorY == 0 {
+               t.writeLine(t.prompt)
+               t.c.Write(t.outBuf)
+               t.outBuf = t.outBuf[:0]
+       }
+
+       lineIsPasted := t.pasteActive
+
+       for {
+               rest := t.remainder
+               lineOk := false
+               for !lineOk {
+                       var key rune
+                       key, rest = bytesToKey(rest, t.pasteActive)
+                       if key == utf8.RuneError {
+                               break
+                       }
+                       if !t.pasteActive {
+                               if key == keyCtrlD {
+                                       if len(t.line) == 0 {
+                                               return "", io.EOF
+                                       }
+                               }
+                               if key == keyPasteStart {
+                                       t.pasteActive = true
+                                       if len(t.line) == 0 {
+                                               lineIsPasted = true
+                                       }
+                                       continue
+                               }
+                       } else if key == keyPasteEnd {
+                               t.pasteActive = false
+                               continue
+                       }
+                       if !t.pasteActive {
+                               lineIsPasted = false
+                       }
+                       line, lineOk = t.handleKey(key)
+               }
+               if len(rest) > 0 {
+                       n := copy(t.inBuf[:], rest)
+                       t.remainder = t.inBuf[:n]
+               } else {
+                       t.remainder = nil
+               }
+               t.c.Write(t.outBuf)
+               t.outBuf = t.outBuf[:0]
+               if lineOk {
+                       if t.echo {
+                               t.historyIndex = -1
+                               t.history.Add(line)
+                       }
+                       if lineIsPasted {
+                               err = ErrPasteIndicator
+                       }
+                       return
+               }
+
+               // t.remainder is a slice at the beginning of t.inBuf
+               // containing a partial key sequence
+               readBuf := t.inBuf[len(t.remainder):]
+               var n int
+
+               t.lock.Unlock()
+               n, err = t.c.Read(readBuf)
+               t.lock.Lock()
+
+               if err != nil {
+                       return
+               }
+
+               t.remainder = t.inBuf[:n+len(t.remainder)]
+       }
+}
+
+// SetPrompt sets the prompt to be used when reading subsequent lines.
+func (t *Terminal) SetPrompt(prompt string) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       t.prompt = []rune(prompt)
+}
+
+func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
+       // Move cursor to column zero at the start of the line.
+       t.move(t.cursorY, 0, t.cursorX, 0)
+       t.cursorX, t.cursorY = 0, 0
+       t.clearLineToRight()
+       for t.cursorY < numPrevLines {
+               // Move down a line
+               t.move(0, 1, 0, 0)
+               t.cursorY++
+               t.clearLineToRight()
+       }
+       // Move back to beginning.
+       t.move(t.cursorY, 0, 0, 0)
+       t.cursorX, t.cursorY = 0, 0
+
+       t.queue(t.prompt)
+       t.advanceCursor(visualLength(t.prompt))
+       t.writeLine(t.line)
+       t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) SetSize(width, height int) error {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       if width == 0 {
+               width = 1
+       }
+
+       oldWidth := t.termWidth
+       t.termWidth, t.termHeight = width, height
+
+       switch {
+       case width == oldWidth:
+               // If the width didn't change then nothing else needs to be
+               // done.
+               return nil
+       case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
+               // If there is nothing on current line and no prompt printed,
+               // just do nothing
+               return nil
+       case width < oldWidth:
+               // Some terminals (e.g. xterm) will truncate lines that were
+               // too long when shinking. Others, (e.g. gnome-terminal) will
+               // attempt to wrap them. For the former, repainting t.maxLine
+               // works great, but that behaviour goes badly wrong in the case
+               // of the latter because they have doubled every full line.
+
+               // We assume that we are working on a terminal that wraps lines
+               // and adjust the cursor position based on every previous line
+               // wrapping and turning into two. This causes the prompt on
+               // xterms to move upwards, which isn't great, but it avoids a
+               // huge mess with gnome-terminal.
+               if t.cursorX >= t.termWidth {
+                       t.cursorX = t.termWidth - 1
+               }
+               t.cursorY *= 2
+               t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
+       case width > oldWidth:
+               // If the terminal expands then our position calculations will
+               // be wrong in the future because we think the cursor is
+               // |t.pos| chars into the string, but there will be a gap at
+               // the end of any wrapped line.
+               //
+               // But the position will actually be correct until we move, so
+               // we can move back to the beginning and repaint everything.
+               t.clearAndRepaintLinePlusNPrevious(t.maxLine)
+       }
+
+       _, err := t.c.Write(t.outBuf)
+       t.outBuf = t.outBuf[:0]
+       return err
+}
+
+type pasteIndicatorError struct{}
+
+func (pasteIndicatorError) Error() string {
+       return "terminal: ErrPasteIndicator not correctly handled"
+}
+
+// ErrPasteIndicator may be returned from ReadLine as the error, in addition
+// to valid line data. It indicates that bracketed paste mode is enabled and
+// that the returned line consists only of pasted data. Programs may wish to
+// interpret pasted data more literally than typed data.
+var ErrPasteIndicator = pasteIndicatorError{}
+
+// SetBracketedPasteMode requests that the terminal bracket paste operations
+// with markers. Not all terminals support this but, if it is supported, then
+// enabling this mode will stop any autocomplete callback from running due to
+// pastes. Additionally, any lines that are completely pasted will be returned
+// from ReadLine with the error set to ErrPasteIndicator.
+func (t *Terminal) SetBracketedPasteMode(on bool) {
+       if on {
+               io.WriteString(t.c, "\x1b[?2004h")
+       } else {
+               io.WriteString(t.c, "\x1b[?2004l")
+       }
+}
+
+// stRingBuffer is a ring buffer of strings.
+type stRingBuffer struct {
+       // entries contains max elements.
+       entries []string
+       max     int
+       // head contains the index of the element most recently added to the ring.
+       head int
+       // size contains the number of elements in the ring.
+       size int
+}
+
+func (s *stRingBuffer) Add(a string) {
+       if s.entries == nil {
+               const defaultNumEntries = 100
+               s.entries = make([]string, defaultNumEntries)
+               s.max = defaultNumEntries
+       }
+
+       s.head = (s.head + 1) % s.max
+       s.entries[s.head] = a
+       if s.size < s.max {
+               s.size++
+       }
+}
+
+// NthPreviousEntry returns the value passed to the nth previous call to Add.
+// If n is zero then the immediately prior value is returned, if one, then the
+// next most recent, and so on. If such an element doesn't exist then ok is
+// false.
+func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
+       if n >= s.size {
+               return "", false
+       }
+       index := s.head - n
+       if index < 0 {
+               index += s.max
+       }
+       return s.entries[index], true
+}
+
+// readPasswordLine reads from reader until it finds \n or io.EOF.
+// The slice returned does not include the \n.
+// readPasswordLine also ignores any \r it finds.
+func readPasswordLine(reader io.Reader) ([]byte, error) {
+       var buf [1]byte
+       var ret []byte
+
+       for {
+               n, err := reader.Read(buf[:])
+               if n > 0 {
+                       switch buf[0] {
+                       case '\n':
+                               return ret, nil
+                       case '\r':
+                               // remove \r from passwords on Windows
+                       default:
+                               ret = append(ret, buf[0])
+                       }
+                       continue
+               }
+               if err != nil {
+                       if err == io.EOF && len(ret) > 0 {
+                               return ret, nil
+                       }
+                       return ret, err
+               }
+       }
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go
new file mode 100644 (file)
index 0000000..d019196
--- /dev/null
@@ -0,0 +1,119 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+//     oldState, err := terminal.MakeRaw(0)
+//     if err != nil {
+//             panic(err)
+//     }
+//     defer terminal.Restore(0, oldState)
+package terminal // import "golang.org/x/crypto/ssh/terminal"
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+// State contains the state of a terminal.
+type State struct {
+       termios syscall.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       var termios syscall.Termios
+       _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
+       return err == 0
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+       var oldState State
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       newState := oldState.termios
+       // This attempts to replicate the behaviour documented for cfmakeraw in
+       // the termios(3) manpage.
+       newState.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON
+       newState.Oflag &^= syscall.OPOST
+       newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN
+       newState.Cflag &^= syscall.CSIZE | syscall.PARENB
+       newState.Cflag |= syscall.CS8
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       return &oldState, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+       var oldState State
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       return &oldState, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0); err != 0 {
+               return err
+       }
+       return nil
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+       var dimensions [4]uint16
+
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 {
+               return -1, -1, err
+       }
+       return int(dimensions[1]), int(dimensions[0]), nil
+}
+
+// passwordReader is an io.Reader that reads from a specific file descriptor.
+type passwordReader int
+
+func (r passwordReader) Read(buf []byte) (int, error) {
+       return syscall.Read(int(r), buf)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       var oldState syscall.Termios
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       newState := oldState
+       newState.Lflag &^= syscall.ECHO
+       newState.Lflag |= syscall.ICANON | syscall.ISIG
+       newState.Iflag |= syscall.ICRNL
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       defer func() {
+               syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0)
+       }()
+
+       return readPasswordLine(passwordReader(fd))
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
new file mode 100644 (file)
index 0000000..9c1ffd1
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package terminal
+
+import "syscall"
+
+const ioctlReadTermios = syscall.TIOCGETA
+const ioctlWriteTermios = syscall.TIOCSETA
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
new file mode 100644 (file)
index 0000000..5883b22
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package terminal
+
+// These constants are declared here, rather than importing
+// them from the syscall package as some syscall packages, even
+// on linux, for example gccgo, do not declare them.
+const ioctlReadTermios = 0x5401  // syscall.TCGETS
+const ioctlWriteTermios = 0x5402 // syscall.TCSETS
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
new file mode 100644 (file)
index 0000000..799f049
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+//     oldState, err := terminal.MakeRaw(0)
+//     if err != nil {
+//             panic(err)
+//     }
+//     defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+       "fmt"
+       "runtime"
+)
+
+type State struct{}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       return false
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+       return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+       return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+       return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+       return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
new file mode 100644 (file)
index 0000000..07eb5ed
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package terminal // import "golang.org/x/crypto/ssh/terminal"
+
+import (
+       "golang.org/x/sys/unix"
+       "io"
+       "syscall"
+)
+
+// State contains the state of a terminal.
+type State struct {
+       termios syscall.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       // see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c
+       var termio unix.Termio
+       err := unix.IoctlSetTermio(fd, unix.TCGETA, &termio)
+       return err == nil
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
+       val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
+       if err != nil {
+               return nil, err
+       }
+       oldState := *val
+
+       newState := oldState
+       newState.Lflag &^= syscall.ECHO
+       newState.Lflag |= syscall.ICANON | syscall.ISIG
+       newState.Iflag |= syscall.ICRNL
+       err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
+       if err != nil {
+               return nil, err
+       }
+
+       defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
+
+       var buf [16]byte
+       var ret []byte
+       for {
+               n, err := syscall.Read(fd, buf[:])
+               if err != nil {
+                       return nil, err
+               }
+               if n == 0 {
+                       if len(ret) == 0 {
+                               return nil, io.EOF
+                       }
+                       break
+               }
+               if buf[n-1] == '\n' {
+                       n--
+               }
+               ret = append(ret, buf[:n]...)
+               if n < len(buf) {
+                       break
+               }
+       }
+
+       return ret, nil
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
new file mode 100644 (file)
index 0000000..e0a1f36
--- /dev/null
@@ -0,0 +1,155 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+//     oldState, err := terminal.MakeRaw(0)
+//     if err != nil {
+//             panic(err)
+//     }
+//     defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+const (
+       enableLineInput       = 2
+       enableEchoInput       = 4
+       enableProcessedInput  = 1
+       enableWindowInput     = 8
+       enableMouseInput      = 16
+       enableInsertMode      = 32
+       enableQuickEditMode   = 64
+       enableExtendedFlags   = 128
+       enableAutoPosition    = 256
+       enableProcessedOutput = 1
+       enableWrapAtEolOutput = 2
+)
+
+var kernel32 = syscall.NewLazyDLL("kernel32.dll")
+
+var (
+       procGetConsoleMode             = kernel32.NewProc("GetConsoleMode")
+       procSetConsoleMode             = kernel32.NewProc("SetConsoleMode")
+       procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
+)
+
+type (
+       short int16
+       word  uint16
+
+       coord struct {
+               x short
+               y short
+       }
+       smallRect struct {
+               left   short
+               top    short
+               right  short
+               bottom short
+       }
+       consoleScreenBufferInfo struct {
+               size              coord
+               cursorPosition    coord
+               attributes        word
+               window            smallRect
+               maximumWindowSize coord
+       }
+)
+
+type State struct {
+       mode uint32
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       var st uint32
+       r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
+       return r != 0 && e == 0
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       raw := st &^ (enableEchoInput | enableProcessedInput | enableLineInput | enableProcessedOutput)
+       _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(raw), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       return &State{st}, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       return &State{st}, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+       _, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(state.mode), 0)
+       return err
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+       var info consoleScreenBufferInfo
+       _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&info)), 0)
+       if e != 0 {
+               return 0, 0, error(e)
+       }
+       return int(info.size.x), int(info.size.y), nil
+}
+
+// passwordReader is an io.Reader that reads from a specific Windows HANDLE.
+type passwordReader int
+
+func (r passwordReader) Read(buf []byte) (int, error) {
+       return syscall.Read(syscall.Handle(r), buf)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       old := st
+
+       st &^= (enableEchoInput)
+       st |= (enableProcessedInput | enableLineInput | enableProcessedOutput)
+       _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(st), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+
+       defer func() {
+               syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(old), 0)
+       }()
+
+       return readPasswordLine(passwordReader(fd))
+}
index af0774fc484b61a206d476fae52b7f471c1a60db..2d3612e6464f4b4848e8800fa6db8c9977072078 100644 (file)
                        "revision": "2bba0603135d7d7f5cb73b2125beeda19c09f4ef",
                        "revisionTime": "2017-03-31T03:19:02Z"
                },
+               {
+                       "checksumSHA1": "i71WrschHLiBZP8tSp5XIHWaLs8=",
+                       "path": "github.com/urfave/cli",
+                       "revision": "637b607ddfd6f973c99874519a553613e960607d",
+                       "revisionTime": "2017-05-06T03:23:19Z"
+               },
                {
                        "checksumSHA1": "4D8hxMIaSDEW5pCQk22Xj4DcDh4=",
                        "path": "golang.org/x/crypto/hkdf",
                        "revision": "efac7f277b17c19894091e358c6130cb6bd51117",
                        "revisionTime": "2017-04-18T01:50:50Z"
                },
+               {
+                       "checksumSHA1": "xiderUuvye8Kpn7yX3niiJg32bE=",
+                       "path": "golang.org/x/crypto/ssh/terminal",
+                       "revision": "efac7f277b17c19894091e358c6130cb6bd51117",
+                       "revisionTime": "2017-04-18T01:50:50Z"
+               },
                {
                        "checksumSHA1": "KWagmSPuJfztcD7dcZekYeZJ6Fg=",
                        "path": "golang.org/x/sys/unix",