diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 710e908..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,289 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/Microsoft/go-winio" - packages = ["."] - revision = "7da180ee92d8bd8bb8c37fc560e673e6557c392f" - version = "v0.4.7" - -[[projects]] - name = "github.com/andygrunwald/go-jira" - packages = ["."] - revision = "5cfdb85cc91c6299f75b6504a1d0ec174c21be39" - version = "v1.3.0" - -[[projects]] - branch = "master" - name = "github.com/chzyer/readline" - packages = ["."] - revision = "f6d7a1f6fbf35bbf9beb80dc63c56a29dcfb759f" - -[[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - name = "github.com/docker/distribution" - packages = [ - "digest", - "reference" - ] - revision = "48294d928ced5dd9b378f7fd7c6f5da3ff3f2c89" - version = "v2.6.2" - -[[projects]] - name = "github.com/docker/docker" - packages = [ - "api/types", - "api/types/blkiodev", - "api/types/container", - "api/types/events", - "api/types/filters", - "api/types/mount", - "api/types/network", - "api/types/reference", - "api/types/registry", - "api/types/strslice", - "api/types/swarm", - "api/types/time", - "api/types/versions", - "api/types/volume", - "client", - "pkg/tlsconfig" - ] - revision = "092cba3727bb9b4a2f0e922cd6c0f93ea270e363" - version = "v1.13.1" - -[[projects]] - name = "github.com/docker/go-connections" - packages = [ - "nat", - "sockets", - "tlsconfig" - ] - revision = "3ede32e2033de7505e6500d6c868c2b9ed9f169d" - version = "v0.3.0" - -[[projects]] - name = "github.com/docker/go-units" - packages = ["."] - revision = "0dadbb0345b35ec7ef35e228dabb8de89a65bf52" - version = "v0.3.2" - -[[projects]] - name = "github.com/elazarl/go-bindata-assetfs" - packages = ["."] - revision = "30f82fa23fd844bd5bb1e5f216db87fd77b5eb43" - version = "v1.0.0" - -[[projects]] - name = "github.com/fatih/color" - packages = ["."] - revision = "507f6050b8568533fb3f5504de8e5205fa62a114" - version = "v1.6.0" - -[[projects]] - name = "github.com/fatih/structs" - packages = ["."] - revision = "a720dfa8df582c51dee1b36feabb906bde1588bd" - version = "v1.0" - -[[projects]] - name = "github.com/fsnotify/fsnotify" - packages = ["."] - revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" - version = "v1.4.7" - -[[projects]] - name = "github.com/gohugoio/hugo" - packages = ["watcher"] - revision = "f414966b942b5aad75565bee6c644782a07f0658" - version = "v0.37.1" - -[[projects]] - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "925541529c1fa6821df4e44ce2723319eb2be768" - version = "v1.0.0" - -[[projects]] - name = "github.com/google/go-github" - packages = ["github"] - revision = "e48060a28fac52d0f1cb758bc8b87c07bac4a87d" - version = "v15.0.0" - -[[projects]] - branch = "master" - name = "github.com/google/go-querystring" - packages = ["query"] - revision = "53e6ce116135b80d037921a7fdd5138cf32d7a8a" - -[[projects]] - name = "github.com/gorilla/websocket" - packages = ["."] - revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" - version = "v1.2.0" - -[[projects]] - branch = "master" - name = "github.com/jcelliott/lumber" - packages = ["."] - revision = "dd349441af25132d146d7095c6693a15431fc9b1" - -[[projects]] - branch = "master" - name = "github.com/juju/ansiterm" - packages = [ - ".", - "tabwriter" - ] - revision = "720a0952cc2ac777afc295d9861263e2a4cf96a1" - -[[projects]] - branch = "master" - name = "github.com/lunixbochs/vtclean" - packages = ["."] - revision = "d14193dfc626125c831501c1c42340b4248e1f5a" - -[[projects]] - branch = "master" - name = "github.com/manifoldco/promptui" - packages = [ - ".", - "list", - "screenbuf" - ] - revision = "c0c0d3afc6a03bcb5c1df10b70b862a650db9f9b" - -[[projects]] - name = "github.com/mattn/go-colorable" - packages = ["."] - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - name = "github.com/mattn/go-isatty" - packages = ["."] - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" - -[[projects]] - name = "github.com/mattn/go-runewidth" - packages = ["."] - revision = "9e777a8366cce605130a531d2cd6363d07ad7317" - version = "v0.0.2" - -[[projects]] - branch = "master" - name = "github.com/nanobox-io/golang-scribble" - packages = ["."] - revision = "ced58d671850da57ce8c11315424513b608083d7" - -[[projects]] - branch = "master" - name = "github.com/olekukonko/tablewriter" - packages = ["."] - revision = "b8a9be070da40449e501c3c4730a889e42d87a9e" - -[[projects]] - name = "github.com/pkg/errors" - packages = ["."] - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - name = "github.com/robfig/cron" - packages = ["."] - revision = "b024fc5ea0e34bc3f83d9941c8d60b0622bfaca4" - version = "v1" - -[[projects]] - branch = "master" - name = "github.com/skratchdot/open-golang" - packages = ["open"] - revision = "75fb7ed4208cf72d323d7d02fd1a5964a7a9073c" - -[[projects]] - name = "github.com/trivago/tgo" - packages = [ - "tcontainer", - "treflect" - ] - revision = "e4d1ddd28c17dd89ed26327cf69fded22060671b" - version = "v1.0.1" - -[[projects]] - name = "github.com/urfave/cli" - packages = ["."] - revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" - version = "v1.20.0" - -[[projects]] - name = "github.com/xanzy/go-gitlab" - packages = ["."] - revision = "79dad8e74fd097eb2e0fd0883f1978213e88107a" - version = "v0.10.7" - -[[projects]] - name = "github.com/yosssi/ace" - packages = ["."] - revision = "ea038f4770b6746c3f8f84f14fa60d9fe1205b56" - version = "v0.0.5" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp", - "proxy" - ] - revision = "d0aafc73d5cdc42264b0af071c261abac580695e" - -[[projects]] - branch = "master" - name = "golang.org/x/oauth2" - packages = [ - ".", - "internal" - ] - revision = "7af32f14d0a25aec7873e0683e8e48dcead159a8" - -[[projects]] - branch = "master" - name = "golang.org/x/sys" - packages = [ - "unix", - "windows" - ] - revision = "dd2ff4accc098aceecb86b36eaa7829b2a17b1c9" - -[[projects]] - name = "google.golang.org/appengine" - packages = [ - "internal", - "internal/base", - "internal/datastore", - "internal/log", - "internal/remote_api", - "internal/urlfetch", - "urlfetch" - ] - revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" - version = "v1.0.0" - -[[projects]] - name = "gopkg.in/yaml.v2" - packages = ["."] - revision = "7f97868eec74b32b0982dd158a51a446d1da7eb5" - version = "v2.1.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "50dc710fa4b581d4fd6907e0e3337c53c3d530e46c53aa71ef9f8e80d3a54d8b" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index 24f0f17..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,30 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[prune] - go-tests = true - unused-packages = true diff --git a/Makefile b/Makefile index b8f153c..0d54cb7 100644 --- a/Makefile +++ b/Makefile @@ -3,11 +3,10 @@ GO_SOURCES := $(shell find . -name '*.go') THEME_SOURCES := $(shell find themes) assets: $(THEME_SOURCES) - @go get github.com/jteeuwen/go-bindata/... - @go get github.com/elazarl/go-bindata-assetfs/... - @go install github.com/elazarl/go-bindata-assetfs - go-bindata-assetfs -o bindata.go -pkg theme -prefix themes themes/... - mv bindata.go internal/theme/themes_bindata.go + go install -mod=vendor github.com/containous/go-bindata/go-bindata + go install -mod=vendor github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs + go-bindata-assetfs -pkg theme -prefix themes themes/... + mv bindata_assetfs.go internal/theme/themes_bindata.go comply: assets $(GO_SOURCES) @# $(eval VERSION := $(shell git describe --tags --always --dirty="-dev")) @@ -128,7 +127,7 @@ minor: clean gitsem release-deps: gitsem gh-release gitsem: - go get -u github.com/Clever/gitsem + go install github.com/Clever/gitsem gh-release: - go get -u github.com/aktau/github-release \ No newline at end of file + go install github.com/aktau/github-release \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..57d5303 --- /dev/null +++ b/go.mod @@ -0,0 +1,56 @@ +module github.com/strongdm/comply + +go 1.12 + +require ( + github.com/Clever/gitsem v1.0.4 + github.com/Microsoft/go-winio v0.4.7 // indirect + github.com/aktau/github-release v0.7.2 + github.com/andygrunwald/go-jira v1.3.0 + github.com/chzyer/logex v1.1.10 // indirect + github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3 // indirect + github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 // indirect + github.com/containous/go-bindata v1.0.0 + github.com/davecgh/go-spew v1.1.0 + github.com/docker/distribution v2.6.2+incompatible // indirect + github.com/docker/docker v1.13.1 + github.com/docker/go-connections v0.3.0 // indirect + github.com/docker/go-units v0.3.2 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/elazarl/go-bindata-assetfs v0.0.0-20170227122030-30f82fa23fd8 + github.com/fatih/color v1.6.0 + github.com/fatih/structs v1.0.0 // indirect + github.com/fsnotify/fsnotify v1.4.7 // indirect + github.com/gohugoio/hugo v0.37.1 + github.com/golang/protobuf v1.0.0 // indirect + github.com/google/go-github v15.0.0+incompatible + github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 // indirect + github.com/gorilla/websocket v1.2.0 + github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 // indirect + github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect + github.com/lunixbochs/vtclean v0.0.0-20170504063817-d14193dfc626 // indirect + github.com/manifoldco/promptui v0.0.0-20180308161052-c0c0d3afc6a0 + github.com/mattn/go-colorable v0.0.9 // indirect + github.com/mattn/go-isatty v0.0.3 // indirect + github.com/mattn/go-runewidth v0.0.2 // indirect + github.com/nanobox-io/golang-scribble v0.0.0-20171026142921-ced58d671850 + github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 + github.com/pkg/errors v0.8.0 + github.com/robfig/cron v1.0.0 + github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c + github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect + github.com/stretchr/testify v1.3.0 // indirect + github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect + github.com/trivago/tgo v1.0.1 // indirect + github.com/urfave/cli v1.20.0 + github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2 // indirect + github.com/xanzy/go-gitlab v0.10.7 + github.com/yosssi/ace v0.0.5 + golang.org/x/net v0.0.0-20180308154319-d0aafc73d5cd // indirect + golang.org/x/oauth2 v0.0.0-20180312235849-7af32f14d0a2 + golang.org/x/sync v0.0.0-20190423024810-112230192c58 // indirect + golang.org/x/sys v0.0.0-20180302081741-dd2ff4accc09 // indirect + google.golang.org/appengine v1.0.0 // indirect + gopkg.in/blang/semver.v1 v1.1.0 // indirect + gopkg.in/yaml.v2 v2.1.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..460eafe --- /dev/null +++ b/go.sum @@ -0,0 +1,105 @@ +github.com/Clever/gitsem v1.0.4 h1:b9y39NChuNb4a/m75AawMuz/Ej9gG4eFl9WMV8yRG0k= +github.com/Clever/gitsem v1.0.4/go.mod h1:mtKYzl9t9gJLmW5s3FnQ/gSwxu06cNVPtZqOq9g1Ips= +github.com/Microsoft/go-winio v0.4.7 h1:vOvDiY/F1avSWlCWiKJjdYKz2jVjTK3pWPHndeG4OAY= +github.com/Microsoft/go-winio v0.4.7/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/aktau/github-release v0.7.2 h1:la7AnShr2MQPIlBEcRA9MPbI8av0YFmpFP9WM5EoqJs= +github.com/aktau/github-release v0.7.2/go.mod h1:cPkP83iRnV8pAJyQlQ4vjLJoC+JE+aT5sOrYz3sTsX0= +github.com/andygrunwald/go-jira v1.3.0 h1:N1cRPudcy0Sl0By6ZHeOhs7lOQztpfzWozO/d3Z4Ipw= +github.com/andygrunwald/go-jira v1.3.0/go.mod h1:yNYQrX3nGSrVdcVsM2mWz2pm7tTeDtYfRyVEkc3VUiY= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3 h1:T7Bw4H6z3WAZ2khw+gfKdYmbKHyy5xiHtk9IHfZqm7g= +github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/containous/go-bindata v1.0.0 h1:ZpunUnBEVuQ1BUbhTuhhbsPU2crte+qD3Jg9NCol4o0= +github.com/containous/go-bindata v1.0.0/go.mod h1:wrtxd41xkdQM2ejRCncH0CwN0YEyACBzOy3S3gl0sVU= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/distribution v2.6.2+incompatible h1:4FI6af79dfCS/CYb+RRtkSHw3q1L/bnDjG1PcPZtQhM= +github.com/docker/distribution v2.6.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo= +github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.3.0 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.2 h1:Kjm80apys7gTtfVmCvVY8gwu10uofaFSrmAKOVrtueE= +github.com/docker/go-units v0.3.2/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/go-bindata-assetfs v0.0.0-20170227122030-30f82fa23fd8 h1:nlhwxV9RE03oHlCRgt4Gx8jYhoRT3k3jMgDxGhiTIuI= +github.com/elazarl/go-bindata-assetfs v0.0.0-20170227122030-30f82fa23fd8/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/structs v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU= +github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gohugoio/hugo v0.37.1 h1:/4bxNfqZUf/CiKw2XGW4Ll6ohEkJ24sIh5/5ln8f/us= +github.com/gohugoio/hugo v0.37.1/go.mod h1:4MkH5HA+adqD/APh9l+k6XD885lVN66vUmjs1zhPUGQ= +github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-github v15.0.0+incompatible h1:jlPg2Cpsxb/FyEV/MFiIE9tW/2RAevQNZDPeHbf5a94= +github.com/google/go-github v15.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/gorilla/websocket v1.2.0 h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ= +github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 h1:EFT6MH3igZK/dIVqgGbTqWVvkZ7wJ5iGN03SVtvvdd8= +github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25/go.mod h1:sWkGw/wsaHtRsT9zGQ/WyJCotGWG/Anow/9hsAcBWRw= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= +github.com/lunixbochs/vtclean v0.0.0-20170504063817-d14193dfc626 h1:33Ys8SnkRfz5ojdG853pyT/2Iqbk95PVm+QrC5XvI70= +github.com/lunixbochs/vtclean v0.0.0-20170504063817-d14193dfc626/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/manifoldco/promptui v0.0.0-20180308161052-c0c0d3afc6a0 h1:iPS1JFQ6IaiXe5Hsr+BpI++BYQHJnMH0InESZZuWPzM= +github.com/manifoldco/promptui v0.0.0-20180308161052-c0c0d3afc6a0/go.mod h1:zoCNXiJnyM03LlBgTsWv8mq28s7aTC71UgKasqRJHww= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/nanobox-io/golang-scribble v0.0.0-20171026142921-ced58d671850 h1:/pQiS63V/MBGmh7IcfJb0qiRp8021tvZnz90bXuMLDI= +github.com/nanobox-io/golang-scribble v0.0.0-20171026142921-ced58d671850/go.mod h1:4Mct/lWCFf1jzQTTAaWtOI7sXqmG+wBeiBfT4CxoaJk= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 h1:Mm4XQCBICntJzH8fKglsRuEiFUJYnTnM4BBFvpP5BWs= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/robfig/cron v1.0.0 h1:slmQxIUH6U9ruw4XoJ7C2pyyx4yYeiHx8S9pNootHsM= +github.com/robfig/cron v1.0.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c h1:fyKiXKO1/I/B6Y2U8T7WdQGWzwehOuGIrljPtt7YTTI= +github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 h1:4bT0pPowCpQImewr+BjzfUKcuFW+KVyB8d1OF3b6oTI= +github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50/go.mod h1:1pdIZTAHUz+HDKDVZ++5xg/duPlhKAIzw9qy42CWYp4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= +github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= +github.com/trivago/tgo v1.0.1 h1:bxatjJIXNIpV18bucU4Uk/LaoxvxuOlp/oowRHyncLQ= +github.com/trivago/tgo v1.0.1/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= +github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2 h1:txplJASvd6b/hrE0s/Ixfpp2cuwH9IO9oZBAN9iYa4A= +github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2/go.mod h1:DGCIhurYgnLz8J9ga1fMV/fbLDyUvTyrWXVWUIyJon4= +github.com/xanzy/go-gitlab v0.10.7 h1:jSMbop08P0ghcWWw1/3f2x/iuygVpHVvoPU38ggD5/A= +github.com/xanzy/go-gitlab v0.10.7/go.mod h1:CRKHkvFWNU6C3AEfqLWjnCNnAs4nj8Zk95rX2S3X6Mw= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +golang.org/x/net v0.0.0-20180308154319-d0aafc73d5cd h1:GNzbLJRy/nHOFS5m5780xbL4nia5w6cyb8exQGYw3Z4= +golang.org/x/net v0.0.0-20180308154319-d0aafc73d5cd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180312235849-7af32f14d0a2 h1:KMoIEaoOnIyurmeSm5jSv9GyDIzYKcBwc8PS5xuJX/g= +golang.org/x/oauth2 v0.0.0-20180312235849-7af32f14d0a2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180302081741-dd2ff4accc09 h1:wNPZbZUOH0tyqngVRXeF2iQm19+ssqyebJTCFBvxsow= +golang.org/x/sys v0.0.0-20180302081741-dd2ff4accc09/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +google.golang.org/appengine v1.0.0 h1:dN4LljjBKVChsv0XCSI+zbyzdqrkEwX5LQFUMRSGqOc= +google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +gopkg.in/blang/semver.v1 v1.1.0 h1:8h4PreLfo/i02SSprIOVzSd+uIdNdc67482RZ70zRKo= +gopkg.in/blang/semver.v1 v1.1.0/go.mod h1:2PLJnEcrEN1cRLwCp2WHiy1foxXpkpuecwId0kRh4to= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.1.1 h1:fxK3tv8mQPVEgxu/S2LJ040LyqiajHt+syP0CdDS/Sc= +gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/theme/themes_bindata.go b/internal/theme/themes_bindata.go index fe8cb8c..e9184ef 100644 --- a/internal/theme/themes_bindata.go +++ b/internal/theme/themes_bindata.go @@ -137,7 +137,7 @@ func complyBlankReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-blank/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -157,7 +157,7 @@ func complyBlankTodoMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-blank/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -177,7 +177,7 @@ func complyBlankNarrativesGitkeep() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/narratives/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1525909140, 0)} + info := bindataFileInfo{name: "comply-blank/narratives/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -197,7 +197,7 @@ func complyBlankPoliciesGitkeep() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/policies/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1525909140, 0)} + info := bindataFileInfo{name: "comply-blank/policies/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -217,7 +217,7 @@ func complyBlankProceduresGitkeep() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/procedures/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1525909140, 0)} + info := bindataFileInfo{name: "comply-blank/procedures/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -237,7 +237,7 @@ func complyBlankStandardsGitkeep() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/standards/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1525909140, 0)} + info := bindataFileInfo{name: "comply-blank/standards/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -257,7 +257,7 @@ func complyBlankTemplatesGitkeep() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/templates/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1525909140, 0)} + info := bindataFileInfo{name: "comply-blank/templates/.gitkeep", size: 0, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -277,7 +277,7 @@ func complyBlankTemplatesDefaultLatex() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-blank/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -297,7 +297,7 @@ func complyBlankTemplatesIndexAce() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-blank/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-blank/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -317,7 +317,7 @@ func complySoc2ReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -337,7 +337,7 @@ func complySoc2TodoMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -357,7 +357,7 @@ func complySoc2NarrativesReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/README.md", size: 96, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/README.md", size: 96, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -377,7 +377,7 @@ func complySoc2NarrativesControlMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/control.md", size: 3325, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/control.md", size: 3325, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -397,7 +397,7 @@ func complySoc2NarrativesOrganizationalMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/organizational.md", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/organizational.md", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -417,7 +417,7 @@ func complySoc2NarrativesProductsMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/products.md", size: 895, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/products.md", size: 895, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -437,7 +437,7 @@ func complySoc2NarrativesSecurityMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/security.md", size: 4047, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/security.md", size: 4047, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -457,7 +457,7 @@ func complySoc2NarrativesSystemMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/narratives/system.md", size: 257, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/narratives/system.md", size: 257, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -477,7 +477,7 @@ func complySoc2PoliciesReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/README.md", size: 71, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/README.md", size: 71, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -497,7 +497,7 @@ func complySoc2PoliciesAccessMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/access.md", size: 2178, mode: os.FileMode(420), modTime: time.Unix(1545087106, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/access.md", size: 2178, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -517,7 +517,7 @@ func complySoc2PoliciesApplicationMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/application.md", size: 8377, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/application.md", size: 8377, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -537,7 +537,7 @@ func complySoc2PoliciesAvailabilityMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/availability.md", size: 7019, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/availability.md", size: 7019, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -557,7 +557,7 @@ func complySoc2PoliciesChangeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/change.md", size: 2793, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/change.md", size: 2793, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -577,7 +577,7 @@ func complySoc2PoliciesClassificationMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/classification.md", size: 14376, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/classification.md", size: 14376, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -597,7 +597,7 @@ func complySoc2PoliciesConductMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/conduct.md", size: 4492, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/conduct.md", size: 4492, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -617,7 +617,7 @@ func complySoc2PoliciesConfidentialityMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/confidentiality.md", size: 3653, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/confidentiality.md", size: 3653, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -637,7 +637,7 @@ func complySoc2PoliciesContinuityMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/continuity.md", size: 5043, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/continuity.md", size: 5043, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -657,7 +657,7 @@ func complySoc2PoliciesCyberMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/cyber.md", size: 4805, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/cyber.md", size: 4805, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -677,7 +677,7 @@ func complySoc2PoliciesDatacenterMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/datacenter.md", size: 3014, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/datacenter.md", size: 3014, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -697,7 +697,7 @@ func complySoc2PoliciesDevelopmentMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/development.md", size: 8933, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/development.md", size: 8933, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -717,7 +717,7 @@ func complySoc2PoliciesDisasterMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/disaster.md", size: 10315, mode: os.FileMode(420), modTime: time.Unix(1545087106, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/disaster.md", size: 10315, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -737,7 +737,7 @@ func complySoc2PoliciesEncryptionMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/encryption.md", size: 5381, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/encryption.md", size: 5381, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -757,7 +757,7 @@ func complySoc2PoliciesIncidentMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/incident.md", size: 8552, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/incident.md", size: 8552, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -777,7 +777,7 @@ func complySoc2PoliciesInformationMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/information.md", size: 5359, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/information.md", size: 5359, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -797,7 +797,7 @@ func complySoc2PoliciesLogMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/log.md", size: 4307, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/log.md", size: 4307, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -817,7 +817,7 @@ func complySoc2PoliciesMediaMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/media.md", size: 8819, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/media.md", size: 8819, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -837,7 +837,7 @@ func complySoc2PoliciesOfficeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/office.md", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/office.md", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -857,7 +857,7 @@ func complySoc2PoliciesPasswordMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/password.md", size: 1796, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/password.md", size: 1796, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -877,7 +877,7 @@ func complySoc2PoliciesPolicyMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/policy.md", size: 892, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/policy.md", size: 892, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -897,7 +897,7 @@ func complySoc2PoliciesPrivacyMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/privacy.md", size: 346, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/privacy.md", size: 346, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -917,7 +917,7 @@ func complySoc2PoliciesProcessingMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/processing.md", size: 210, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/processing.md", size: 210, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -937,7 +937,7 @@ func complySoc2PoliciesRemoteMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/remote.md", size: 4119, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/remote.md", size: 4119, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -957,7 +957,7 @@ func complySoc2PoliciesRetentionMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/retention.md", size: 6811, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/retention.md", size: 6811, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -977,7 +977,7 @@ func complySoc2PoliciesRiskMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/risk.md", size: 10486, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/risk.md", size: 10486, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -997,7 +997,7 @@ func complySoc2PoliciesVendorMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/vendor.md", size: 3139, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/vendor.md", size: 3139, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1017,7 +1017,7 @@ func complySoc2PoliciesWorkstationMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/policies/workstation.md", size: 1791, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/policies/workstation.md", size: 1791, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1037,7 +1037,7 @@ func complySoc2ProceduresReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/procedures/README.md", size: 92, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/procedures/README.md", size: 92, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1057,7 +1057,7 @@ func complySoc2ProceduresOffboardingMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/procedures/offboarding.md", size: 358, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/procedures/offboarding.md", size: 358, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1077,7 +1077,7 @@ func complySoc2ProceduresOnboardingMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/procedures/onboarding.md", size: 495, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/procedures/onboarding.md", size: 495, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1097,7 +1097,7 @@ func complySoc2ProceduresPatchMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/procedures/patch.md", size: 380, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/procedures/patch.md", size: 380, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1117,7 +1117,7 @@ func complySoc2ProceduresWorkstationMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/procedures/workstation.md", size: 1081, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/procedures/workstation.md", size: 1081, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1137,7 +1137,7 @@ func complySoc2StandardsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/standards/README.md", size: 282, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/standards/README.md", size: 282, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1157,7 +1157,7 @@ func complySoc2StandardsTsc2017Yml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/standards/TSC-2017.yml", size: 16305, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/standards/TSC-2017.yml", size: 16305, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1177,7 +1177,7 @@ func complySoc2TemplatesDefaultLatex() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1197,7 +1197,7 @@ func complySoc2TemplatesIndexAce() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "comply-soc2/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1545086630, 0)} + info := bindataFileInfo{name: "comply-soc2/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1562746750, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/tools.go b/tools.go new file mode 100644 index 0000000..36f1a9a --- /dev/null +++ b/tools.go @@ -0,0 +1,10 @@ +// +build tools + +package tools + +import ( + _ "github.com/Clever/gitsem" + _ "github.com/aktau/github-release" + _ "github.com/containous/go-bindata/go-bindata" // v1.0.0 + _ "github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs" // v0.0.0-20170227122030-30f82fa23fd8 +) diff --git a/vendor/github.com/Clever/gitsem/.drone.yml b/vendor/github.com/Clever/gitsem/.drone.yml new file mode 100644 index 0000000..4be18c3 --- /dev/null +++ b/vendor/github.com/Clever/gitsem/.drone.yml @@ -0,0 +1,24 @@ +image: bradrydzewski/go:1.3 +script: + - make test +notify: + email: + recipients: + - drone@clever.com + hipchat: + room: Clever-Dev-CI + token: {{hipchat_token}} + on_started: true + on_success: true + on_failure: true +publish: + github: + branch: master + script: + - make release + artifacts: + - release + tag: v$(cat VERSION) + token: {{github_token}} + user: Clever + repo: gitsem diff --git a/vendor/github.com/Clever/gitsem/.gitignore b/vendor/github.com/Clever/gitsem/.gitignore new file mode 100644 index 0000000..e2dd185 --- /dev/null +++ b/vendor/github.com/Clever/gitsem/.gitignore @@ -0,0 +1,25 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test + +gitsem diff --git a/vendor/github.com/Clever/gitsem/Makefile b/vendor/github.com/Clever/gitsem/Makefile new file mode 100644 index 0000000..06a8242 --- /dev/null +++ b/vendor/github.com/Clever/gitsem/Makefile @@ -0,0 +1,54 @@ +SHELL := /bin/bash +PKG = github.com/Clever/gitsem +PKGS = $(PKG) +VERSION := $(shell cat VERSION) +EXECUTABLE := gitsem +BUILDS := \ + build/$(EXECUTABLE)-v$(VERSION)-darwin-amd64 \ + build/$(EXECUTABLE)-v$(VERSION)-linux-amd64 \ + build/$(EXECUTABLE)-v$(VERSION)-windows-amd64 +COMPRESSED_BUILDS := $(BUILDS:%=%.tar.gz) +RELEASE_ARTIFACTS := $(COMPRESSED_BUILDS:build/%=release/%) + +.PHONY: test golint + +golint: + @go get github.com/golang/lint/golint + +test: $(PKGS) + +$(PKGS): golint + @go get -d -t $@ + @gofmt -w=true $(GOPATH)/src/$@*/**.go +ifneq ($(NOLINT),1) + @echo "LINTING..." + @PATH=$(PATH):$(GOPATH)/bin golint $(GOPATH)/src/$@*/**.go + @echo "" +endif +ifeq ($(COVERAGE),1) + @go test -cover -coverprofile=$(GOPATH)/src/$@/c.out $@ -test.v + @go tool cover -html=$(GOPATH)/src/$@/c.out +else + @echo "TESTING..." + @go test $@ -test.v +endif + +run: + @go run main.go + +build/$(EXECUTABLE)-v$(VERSION)-darwin-amd64: + GOARCH=amd64 GOOS=darwin go build -o "$@/$(EXECUTABLE)" +build/$(EXECUTABLE)-v$(VERSION)-linux-amd64: + GOARCH=amd64 GOOS=linux go build -o "$@/$(EXECUTABLE)" +build/$(EXECUTABLE)-v$(VERSION)-windows-amd64: + GOARCH=amd64 GOOS=windows go build -o "$@/$(EXECUTABLE).exe" +build: $(BUILDS) +%.tar.gz: % + tar -C `dirname $<` -zcvf "$<.tar.gz" `basename $<` +$(RELEASE_ARTIFACTS): release/% : build/% + mkdir -p release + cp $< $@ +release: $(RELEASE_ARTIFACTS) + +clean: + rm -rf build release diff --git a/vendor/github.com/Clever/gitsem/README.md b/vendor/github.com/Clever/gitsem/README.md new file mode 100644 index 0000000..8cd19bb --- /dev/null +++ b/vendor/github.com/Clever/gitsem/README.md @@ -0,0 +1,34 @@ +# gitsem + +A command line utility for managing semantically versioned (semver) git tags. + +Run this in a git repository to bump the version and write the new data back to the VERSION file. +It will also create a version commit and (optional) tag, and fail if the repo is not clean. + +## Installation + +```shell +$ go get github.com/Clever/gitsem +``` + +## Example +```shell +$ gitsem patch +$ gitsem -m "Upgrade to %s for reasons" patch +$ gitsem minor +``` + +## Usage + +```shell +gitsem [options] version +``` + +`version` can be one of: `newversion | patch | minor | major` + +The version argument should be a valid semver string, or a field of a semver string (one of "patch", "minor", or "major"). +In the second case, the existing version will be incremented by 1 in the specified field. + +### Options + - `m=%s` specifies a commit message to use when bumping the version. If %s appears, it will be replaced with the new version number. + - `tag=true` whether or not to create a tag at the version commit diff --git a/vendor/github.com/Clever/gitsem/VERSION b/vendor/github.com/Clever/gitsem/VERSION new file mode 100644 index 0000000..a6a3a43 --- /dev/null +++ b/vendor/github.com/Clever/gitsem/VERSION @@ -0,0 +1 @@ +1.0.4 \ No newline at end of file diff --git a/vendor/github.com/Clever/gitsem/git.go b/vendor/github.com/Clever/gitsem/git.go new file mode 100644 index 0000000..27e524e --- /dev/null +++ b/vendor/github.com/Clever/gitsem/git.go @@ -0,0 +1,39 @@ +package main + +import ( + "bytes" + "os/exec" + "strings" +) + +func isRepoClean() (bool, error) { + cmd := exec.Command("git", "status", "-s") + result := &bytes.Buffer{} + cmd.Stdout = result + if err := cmd.Run(); err != nil { + return false, err + } + return result.String() == "", nil +} + +func repoRoot() (string, error) { + cmd := exec.Command("git", "rev-parse", "--show-toplevel") + result := &bytes.Buffer{} + cmd.Stdout = result + if err := cmd.Run(); err != nil { + return "", err + } + return strings.TrimSpace(result.String()), nil +} + +func addFile(path string) error { + return exec.Command("git", "add", path).Run() +} + +func commit(message string) error { + return exec.Command("git", "commit", "-m", message).Run() +} + +func tag(version string) error { + return exec.Command("git", "tag", version).Run() +} diff --git a/vendor/github.com/Clever/gitsem/main.go b/vendor/github.com/Clever/gitsem/main.go new file mode 100644 index 0000000..985af5e --- /dev/null +++ b/vendor/github.com/Clever/gitsem/main.go @@ -0,0 +1,126 @@ +package main + +import ( + "flag" + "fmt" + "gopkg.in/blang/semver.v1" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" +) + +func commitMessage(message, version string) string { + if strings.Contains(message, "%s") { + return fmt.Sprintf(message, version) + } + return message +} + +func getCurrentVersion(path string) (*semver.Version, error) { + if _, err := os.Stat(path); os.IsNotExist(err) { + return &semver.Version{}, nil + } + contents, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + return semver.New(strings.TrimSpace(string(contents))) +} + +const versionFileName = "VERSION" + +func exitWithError(message string) { + fmt.Fprintf(os.Stderr, message+"\n\n") + flag.Usage() + os.Exit(1) +} + +func bump(old *semver.Version, part string) *semver.Version { + // We don't want to mutate the input, but there's no Clone or Copy method on a semver.Version, + // so we make a new one by parsing the string version of the old one. + // We ignore any errors because we know it's valid semver. + new, _ := semver.New(old.String()) + switch part { + case "major": + new.Major++ + new.Minor = 0 + new.Patch = 0 + case "minor": + new.Minor++ + new.Patch = 0 + case "patch": + new.Patch++ + } + return new +} + +func main() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "Usage of %s: [options] version\n\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "version can be one of: newversion | patch | minor | major\n\n") + fmt.Fprintf(os.Stderr, "options:\n") + flag.PrintDefaults() + } + message := flag.String("m", "%s", "commit message for version commit") + help := flag.Bool("h", false, "print usage and exit") + shouldTag := flag.Bool("tag", true, "whether or not to make a tag at the version commit") + flag.Parse() + + if *help { + flag.Usage() + os.Exit(0) + } + + if *message == "" { + exitWithError("missing message") + } + + if clean, err := isRepoClean(); err != nil { + log.Fatal(err) + } else if !clean { + log.Fatal("repo isn't clean") + } + + root, err := repoRoot() + if err != nil { + log.Fatal(err) + } + versionFile := filepath.Join(root, versionFileName) + version, err := getCurrentVersion(versionFile) + if err != nil { + log.Fatal(err) + } + if len(flag.Args()) != 1 { + exitWithError("gitsem takes exactly one non-flag argument: version") + } + + newVersion := flag.Args()[0] + switch newVersion { + case "patch", "minor", "major": + version = bump(version, newVersion) + default: + if version, err = semver.New(newVersion); err != nil { + log.Fatalf("failed to parse %s as semver: %s", newVersion, err.Error()) + } + } + + if err := ioutil.WriteFile(versionFile, []byte(version.String()), 0666); err != nil { + log.Fatal(err) + } + if err := addFile(versionFile); err != nil { + log.Fatal(err) + } + versionString := "v" + version.String() + *message = commitMessage(*message, versionString) + if err := commit(*message); err != nil { + log.Fatal(err) + } + if *shouldTag { + if err := tag(versionString); err != nil { + log.Fatal(err) + } + } + fmt.Println(versionString) +} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE b/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE deleted file mode 100644 index 7448756..0000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/aktau/github-release/.gitignore b/vendor/github.com/aktau/github-release/.gitignore new file mode 100644 index 0000000..a266021 --- /dev/null +++ b/vendor/github.com/aktau/github-release/.gitignore @@ -0,0 +1,26 @@ +github-release +go-app +bin/ + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/aktau/github-release/LICENSE b/vendor/github.com/aktau/github-release/LICENSE new file mode 100644 index 0000000..12ed35a --- /dev/null +++ b/vendor/github.com/aktau/github-release/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Nicolas Hillegeer + +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/aktau/github-release/Makefile b/vendor/github.com/aktau/github-release/Makefile new file mode 100644 index 0000000..3e38d45 --- /dev/null +++ b/vendor/github.com/aktau/github-release/Makefile @@ -0,0 +1,83 @@ +LAST_TAG := $(shell git describe --abbrev=0 --tags) + +USER := aktau +EXECUTABLE := github-release + +# only include the amd64 binaries, otherwise the github release will become +# too big +UNIX_EXECUTABLES := \ + darwin/amd64/$(EXECUTABLE) \ + freebsd/amd64/$(EXECUTABLE) \ + linux/amd64/$(EXECUTABLE) +WIN_EXECUTABLES := \ + windows/amd64/$(EXECUTABLE).exe + +COMPRESSED_EXECUTABLES=$(UNIX_EXECUTABLES:%=%.tar.bz2) $(WIN_EXECUTABLES:%.exe=%.zip) +COMPRESSED_EXECUTABLE_TARGETS=$(COMPRESSED_EXECUTABLES:%=bin/%) + +UPLOAD_CMD = bin/tmp/$(EXECUTABLE) upload -u $(USER) -r $(EXECUTABLE) -t $(LAST_TAG) -n $(subst /,-,$(FILE)) -f bin/$(FILE) + +all: $(EXECUTABLE) + +# the executable used to perform the upload, dogfooding and all... +bin/tmp/$(EXECUTABLE): + go build -o "$@" + +# arm +bin/linux/arm/5/$(EXECUTABLE): + GOARM=5 GOARCH=arm GOOS=linux go build -o "$@" +bin/linux/arm/7/$(EXECUTABLE): + GOARM=7 GOARCH=arm GOOS=linux go build -o "$@" + +# 386 +bin/darwin/386/$(EXECUTABLE): + GOARCH=386 GOOS=darwin go build -o "$@" +bin/linux/386/$(EXECUTABLE): + GOARCH=386 GOOS=linux go build -o "$@" +bin/windows/386/$(EXECUTABLE): + GOARCH=386 GOOS=windows go build -o "$@" + +# amd64 +bin/freebsd/amd64/$(EXECUTABLE): + GOARCH=amd64 GOOS=freebsd go build -o "$@" +bin/darwin/amd64/$(EXECUTABLE): + GOARCH=amd64 GOOS=darwin go build -o "$@" +bin/linux/amd64/$(EXECUTABLE): + GOARCH=amd64 GOOS=linux go build -o "$@" +bin/windows/amd64/$(EXECUTABLE).exe: + GOARCH=amd64 GOOS=windows go build -o "$@" + +# compressed artifacts, makes a huge difference (Go executable is ~9MB, +# after compressing ~2MB) +%.tar.bz2: % + tar -jcvf "$<.tar.bz2" "$<" +%.zip: %.exe + zip "$@" "$<" + +# git tag -a v$(RELEASE) -m 'release $(RELEASE)' +release: clean + $(MAKE) bin/tmp/$(EXECUTABLE) $(COMPRESSED_EXECUTABLE_TARGETS) + git push && git push --tags + git log --format=%B $(LAST_TAG) -1 | \ + bin/tmp/$(EXECUTABLE) release -u $(USER) -r $(EXECUTABLE) \ + -t $(LAST_TAG) -n $(LAST_TAG) -d - || true + $(foreach FILE,$(COMPRESSED_EXECUTABLES),$(UPLOAD_CMD);) + +# install and/or update all dependencies, run this from the project directory +# go get -u ./... +# go test -i ./ +dep: + go list -f '{{join .Deps "\n"}}' | xargs go list -e -f '{{if not .Standard}}{{.ImportPath}}{{end}}' | xargs go get -u + +$(EXECUTABLE): dep + go build -o "$@" + +install: + go install + +clean: + rm go-app || true + rm $(EXECUTABLE) || true + rm -rf bin/ + +.PHONY: clean release dep install diff --git a/vendor/github.com/aktau/github-release/README.md b/vendor/github.com/aktau/github-release/README.md new file mode 100644 index 0000000..8143b46 --- /dev/null +++ b/vendor/github.com/aktau/github-release/README.md @@ -0,0 +1,132 @@ +github-release +============== + +A small commandline app written in Go that allows you to easily create +and delete releases of your projects on Github. In addition it allows +you to attach files to those releases. + +It interacts with the [github releases API](http://developer.github.com/v3/repos/releases). +Though it's entirely possibly to [do all these things with +cURL](https://github.com/blog/1645-releases-api-preview), It's not +really that user-friendly. For example, you need to first query the API +to find the id of the release you want, before you can upload an +artifact. `github-release` takes care of those little details. + +It might still be a bit rough around the edges, pull requests are +welcome! + +**NOTE**: I've been made aware of the existence of the +[gothub](https://github.com/itchio/gothub) fork. Since I have very little +time to work on the project and have been a really bad maintainer, I suggest +checking it out to see if your issues have been solved there. + +How to install +============== + +If you don't have the Go toolset installed, and you don't want to, but +still want to use the app, you can download binaries for your platform +on the [releases +page](https://github.com/aktau/github-release/releases/latest). Yes, that's +dogfooding, check the makefile! + +If you have Go installed, you can just do: + +```sh +go get github.com/aktau/github-release +``` + +This will automatically download, compile and install the app. + +After that you should have a `github-release` executable in your +`$GOPATH/bin`. + +How to use +========== + +**NOTE**: for these examples I've [created a github +token](https://help.github.com/articles/creating-an-access-token-for-command-line-use) +and set it as the env variable `GITHUB_TOKEN`. `github-release` will +automatically pick it up from the environment so that you don't have to +pass it as an argument. + +```sh +# set your token +export GITHUB_TOKEN=... + +# check the help +$ github-release --help + +# make your tag and upload +$ git tag ... && git push --tags + +# check the current tags and existing releases of the repo +$ github-release info -u aktau -r gofinance +git tags: +- v0.1.0 (commit: https://api.github.com/repos/aktau/gofinance/commits/f562727ce83ce8971a8569a1879219e41d56a756) +releases: +- v0.1.0, name: 'hoary ungar', description: 'something something dark side 2', id: 166740, tagged: 29/01/2014 at 14:27, published: 30/01/2014 at 16:20, draft: ✔, prerelease: ✗ + - artifact: github.go, downloads: 0, state: uploaded, type: application/octet-stream, size: 1.9KB, id: 68616 + +# create a formal release +$ github-release release \ + --user aktau \ + --repo gofinance \ + --tag v0.1.0 \ + --name "the wolf of source street" \ + --description "Not a movie, contrary to popular opinion. Still, my first release!" \ + --pre-release + +# you've made a mistake, but you can edit the release without +# having to delete it first (this also means you can edit without having +# to upload your files again) +$ github-release edit \ + --user aktau \ + --repo gofinance \ + --tag v0.1.0 \ + --name "Highlander II: The Quickening" \ + --description "This is the actual description!" + +# upload a file, for example the OSX/AMD64 binary of my gofinance app +$ github-release upload \ + --user aktau \ + --repo gofinance \ + --tag v0.1.0 \ + --name "gofinance-osx-amd64" \ + --file bin/darwin/amd64/gofinance + +# upload other files... +$ github-release upload ... + +# you're not happy with it, so delete it +$ github-release delete \ + --user aktau \ + --repo gofinance \ + --tag v0.1.0 +``` + +GitHub Enterprise Support +========================= +You can point to a different GitHub API endpoint via the environment variable ```GITHUB_API```: + +``` +export GITHUB_API=http://github.company.com/api/v3 +``` + +Used libraries +============== + +| Package | Description | License | +| ------------------------------------------------------------------------ | ------------------- | ------- | +| [github.com/dustin/go-humanize](https://github.com/dustin/go-humanize) | humanize file sizes | MIT | +| [github.com/tomnomnom/linkheader](https://github.com/tomnomnom/linkheader) | GH API pagination | MIT | +| [github.com/voxelbrain/goptions](https://github.com/voxelbrain/goptions) | option parsing | BSD | + +Todo +==== + +- Check if an artifact is already uploaded before starting a new upload + +Copyright +========= + +Copyright (c) 2014, Nicolas Hillegeer. All rights reserved. diff --git a/vendor/github.com/aktau/github-release/assets.go b/vendor/github.com/aktau/github-release/assets.go new file mode 100644 index 0000000..22fe791 --- /dev/null +++ b/vendor/github.com/aktau/github-release/assets.go @@ -0,0 +1,32 @@ +package main + +import ( + "time" +) + +const ( + ASSET_DOWNLOAD_URI = "/repos/%s/%s/releases/assets/%d" +) + +type Asset struct { + Url string `json:"url"` + Id int `json:"id"` + Name string `json:"name"` + ContentType string `json:"content_type"` + State string `json:"state"` + Size uint64 `json:"size"` + Downloads uint64 `json:"download_count"` + Created time.Time `json:"created_at"` + Published time.Time `json:"published_at"` +} + +// findAssetID returns the asset ID if name can be found in assets, +// otherwise returns -1. +func findAssetID(assets []Asset, name string) int { + for _, asset := range assets { + if asset.Name == name { + return asset.Id + } + } + return -1 +} diff --git a/vendor/github.com/aktau/github-release/cmd.go b/vendor/github.com/aktau/github-release/cmd.go new file mode 100644 index 0000000..6807084 --- /dev/null +++ b/vendor/github.com/aktau/github-release/cmd.go @@ -0,0 +1,448 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "strconv" + + "github.com/aktau/github-release/github" +) + +func infocmd(opt Options) error { + user := nvls(opt.Info.User, EnvUser) + repo := nvls(opt.Info.Repo, EnvRepo) + token := nvls(opt.Info.Token, EnvToken) + tag := opt.Info.Tag + + if user == "" || repo == "" { + return fmt.Errorf("user and repo need to be passed as arguments") + } + + // Find regular git tags. + foundTags, err := Tags(user, repo, token) + if err != nil { + return fmt.Errorf("could not fetch tags, %v", err) + } + if len(foundTags) == 0 { + return fmt.Errorf("no tags available for %v/%v", user, repo) + } + + tags := foundTags[:0] + for _, t := range foundTags { + // If the user only requested one tag, filter out the rest. + if tag == "" || t.Name == tag { + tags = append(tags, t) + } + } + + renderer := renderInfoText + + if opt.Info.JSON { + renderer = renderInfoJSON + } + + // List releases + assets. + var releases []Release + if tag == "" { + // Get all releases. + vprintf("%v/%v: getting information for all releases\n", user, repo) + releases, err = Releases(user, repo, token) + if err != nil { + return err + } + } else { + // Get only one release. + vprintf("%v/%v/%v: getting information for the release\n", user, repo, tag) + release, err := ReleaseOfTag(user, repo, tag, token) + if err != nil { + return err + } + releases = []Release{*release} + } + + return renderer(tags, releases) +} + +func renderInfoText(tags []Tag, releases []Release) error { + fmt.Println("tags:") + for _, tag := range tags { + fmt.Println("-", &tag) + } + + fmt.Println("releases:") + for _, release := range releases { + fmt.Println("-", &release) + } + + return nil +} + +func renderInfoJSON(tags []Tag, releases []Release) error { + out := struct { + Tags []Tag + Releases []Release + }{ + Tags: tags, + Releases: releases, + } + + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + return enc.Encode(&out) +} + +func uploadcmd(opt Options) error { + user := nvls(opt.Upload.User, EnvUser) + repo := nvls(opt.Upload.Repo, EnvRepo) + token := nvls(opt.Upload.Token, EnvToken) + tag := opt.Upload.Tag + name := opt.Upload.Name + label := opt.Upload.Label + file := opt.Upload.File + + vprintln("uploading...") + + if file == nil { + return fmt.Errorf("provided file was not valid") + } + defer file.Close() + + if err := ValidateCredentials(user, repo, token, tag); err != nil { + return err + } + + // Find the release corresponding to the entered tag, if any. + rel, err := ReleaseOfTag(user, repo, tag, token) + if err != nil { + return err + } + + // If asked to replace, first delete the existing asset, if any. + if assetID := findAssetID(rel.Assets, name); opt.Upload.Replace && assetID != -1 { + URL := nvls(EnvApiEndpoint, github.DefaultBaseURL) + + fmt.Sprintf(ASSET_DOWNLOAD_URI, user, repo, assetID) + resp, err := github.DoAuthRequest("DELETE", URL, "application/json", token, nil, nil) + if err != nil || resp.StatusCode != http.StatusNoContent { + return fmt.Errorf("could not replace asset %s (ID: %d), deletion failed (error: %v, status: %s)", + name, assetID, err, resp.Status) + } + } + + v := url.Values{} + v.Set("name", name) + if label != "" { + v.Set("label", label) + } + + url := rel.CleanUploadUrl() + "?" + v.Encode() + + resp, err := github.DoAuthRequest("POST", url, "application/octet-stream", + token, nil, file) + if err != nil { + return fmt.Errorf("can't create upload request to %v, %v", url, err) + } + defer resp.Body.Close() + + vprintln("RESPONSE:", resp) + if resp.StatusCode != http.StatusCreated { + if msg, err := ToMessage(resp.Body); err == nil { + return fmt.Errorf("could not upload, status code (%v), %v", + resp.Status, msg) + } + return fmt.Errorf("could not upload, status code (%v)", resp.Status) + } + + if VERBOSITY != 0 { + vprintf("BODY: ") + if _, err := io.Copy(os.Stderr, resp.Body); err != nil { + return fmt.Errorf("while reading response, %v", err) + } + } + + return nil +} + +func downloadcmd(opt Options) error { + user := nvls(opt.Download.User, EnvUser) + repo := nvls(opt.Download.Repo, EnvRepo) + token := nvls(opt.Download.Token, EnvToken) + tag := opt.Download.Tag + name := opt.Download.Name + latest := opt.Download.Latest + + vprintln("downloading...") + + if err := ValidateTarget(user, repo, tag, latest); err != nil { + return err + } + + // Find the release corresponding to the entered tag, if any. + var rel *Release + var err error + if latest { + rel, err = LatestRelease(user, repo, token) + } else { + rel, err = ReleaseOfTag(user, repo, tag, token) + } + if err != nil { + return err + } + + assetID := findAssetID(rel.Assets, name) + if assetID == -1 { + return fmt.Errorf("coud not find asset named %s", name) + } + + var resp *http.Response + if token == "" { + // Use the regular github.com site it we don't have a token. + resp, err = http.Get("https://github.com" + fmt.Sprintf("/%s/%s/releases/download/%s/%s", user, repo, tag, name)) + } else { + url := nvls(EnvApiEndpoint, github.DefaultBaseURL) + fmt.Sprintf(ASSET_DOWNLOAD_URI, user, repo, assetID) + resp, err = github.DoAuthRequest("GET", url, "", token, map[string]string{ + "Accept": "application/octet-stream", + }, nil) + } + if err != nil { + return fmt.Errorf("could not fetch releases, %v", err) + } + defer resp.Body.Close() + + vprintln("GET", resp.Request.URL, "->", resp) + + contentLength, err := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64) + if err != nil { + return err + } + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("github did not respond with 200 OK but with %v", resp.Status) + } + + out := os.Stdout // Pipe the asset to stdout by default. + if isCharDevice(out) { + // If stdout is a char device, assume it's a TTY (terminal). In this + // case, don't pipe th easset to stdout, but create it as a file in + // the current working folder. + if out, err = os.Create(name); err != nil { + return fmt.Errorf("could not create file %s", name) + } + defer out.Close() + } + + return mustCopyN(out, resp.Body, contentLength) +} + +// mustCopyN attempts to copy exactly N bytes, if this fails, an error is +// returned. +func mustCopyN(w io.Writer, r io.Reader, n int64) error { + an, err := io.Copy(w, r) + if an != n { + return fmt.Errorf("data did not match content length %d != %d", an, n) + } + return err +} + +func ValidateTarget(user, repo, tag string, latest bool) error { + if user == "" { + return fmt.Errorf("empty user") + } + if repo == "" { + return fmt.Errorf("empty repo") + } + if tag == "" && !latest { + return fmt.Errorf("empty tag") + } + return nil +} + +func ValidateCredentials(user, repo, token, tag string) error { + if err := ValidateTarget(user, repo, tag, false); err != nil { + return err + } + if token == "" { + return fmt.Errorf("empty token") + } + return nil +} + +func releasecmd(opt Options) error { + cmdopt := opt.Release + user := nvls(cmdopt.User, EnvUser) + repo := nvls(cmdopt.Repo, EnvRepo) + token := nvls(cmdopt.Token, EnvToken) + tag := cmdopt.Tag + name := nvls(cmdopt.Name, tag) + desc := nvls(cmdopt.Desc, tag) + target := nvls(cmdopt.Target) + draft := cmdopt.Draft + prerelease := cmdopt.Prerelease + + vprintln("releasing...") + + if err := ValidateCredentials(user, repo, token, tag); err != nil { + return err + } + + // Check if we need to read the description from stdin. + if desc == "-" { + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return fmt.Errorf("could not read description from stdin: %v", err) + } + desc = string(b) + } + + params := ReleaseCreate{ + TagName: tag, + TargetCommitish: target, + Name: name, + Body: desc, + Draft: draft, + Prerelease: prerelease, + } + + /* encode params as json */ + payload, err := json.Marshal(params) + if err != nil { + return fmt.Errorf("can't encode release creation params, %v", err) + } + reader := bytes.NewReader(payload) + + URL := nvls(EnvApiEndpoint, github.DefaultBaseURL) + fmt.Sprintf("/repos/%s/%s/releases", user, repo) + resp, err := github.DoAuthRequest("POST", URL, "application/json", token, nil, reader) + if err != nil { + return fmt.Errorf("while submitting %v, %v", string(payload), err) + } + defer resp.Body.Close() + + vprintln("RESPONSE:", resp) + if resp.StatusCode != http.StatusCreated { + if resp.StatusCode == 422 { + return fmt.Errorf("github returned %v (this is probably because the release already exists)", + resp.Status) + } + return fmt.Errorf("github returned %v", resp.Status) + } + + if VERBOSITY != 0 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("error while reading response, %v", err) + } + vprintln("BODY:", string(body)) + } + + return nil +} + +func editcmd(opt Options) error { + cmdopt := opt.Edit + user := nvls(cmdopt.User, EnvUser) + repo := nvls(cmdopt.Repo, EnvRepo) + token := nvls(cmdopt.Token, EnvToken) + tag := cmdopt.Tag + name := nvls(cmdopt.Name, tag) + desc := nvls(cmdopt.Desc, tag) + draft := cmdopt.Draft + prerelease := cmdopt.Prerelease + + vprintln("editing...") + + if err := ValidateCredentials(user, repo, token, tag); err != nil { + return err + } + + id, err := IdOfTag(user, repo, tag, token) + if err != nil { + return err + } + + vprintf("release %v has id %v\n", tag, id) + + // Check if we need to read the description from stdin. + if desc == "-" { + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return fmt.Errorf("could not read description from stdin: %v", err) + } + desc = string(b) + } + + /* the release create struct works for editing releases as well */ + params := ReleaseCreate{ + TagName: tag, + Name: name, + Body: desc, + Draft: draft, + Prerelease: prerelease, + } + + /* encode the parameters as JSON, as required by the github API */ + payload, err := json.Marshal(params) + if err != nil { + return fmt.Errorf("can't encode release creation params, %v", err) + } + + URL := nvls(EnvApiEndpoint, github.DefaultBaseURL) + fmt.Sprintf("/repos/%s/%s/releases/%d", user, repo, id) + resp, err := github.DoAuthRequest("PATCH", URL, "application/json", token, nil, bytes.NewReader(payload)) + if err != nil { + return fmt.Errorf("while submitting %v, %v", string(payload), err) + } + defer resp.Body.Close() + + vprintln("RESPONSE:", resp) + if resp.StatusCode != http.StatusOK { + if resp.StatusCode == 422 { + return fmt.Errorf("github returned %v (this is probably because the release already exists)", + resp.Status) + } + return fmt.Errorf("github returned unexpected status code %v", resp.Status) + } + + if VERBOSITY != 0 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("error while reading response, %v", err) + } + vprintln("BODY:", string(body)) + } + + return nil +} + +func deletecmd(opt Options) error { + user, repo, token, tag := nvls(opt.Delete.User, EnvUser), + nvls(opt.Delete.Repo, EnvRepo), + nvls(opt.Delete.Token, EnvToken), + opt.Delete.Tag + vprintln("deleting...") + + id, err := IdOfTag(user, repo, tag, token) + if err != nil { + return err + } + + vprintf("release %v has id %v\n", tag, id) + + baseURL := nvls(EnvApiEndpoint, github.DefaultBaseURL) + resp, err := github.DoAuthRequest("DELETE", baseURL+fmt.Sprintf("/repos/%s/%s/releases/%d", + user, repo, id), "application/json", token, nil, nil) + if err != nil { + return fmt.Errorf("release deletion failed: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusNoContent { + return fmt.Errorf("could not delete the release corresponding to tag %s on repo %s/%s", + tag, user, repo) + } + + return nil +} diff --git a/vendor/github.com/aktau/github-release/commit.go b/vendor/github.com/aktau/github-release/commit.go new file mode 100644 index 0000000..093abdf --- /dev/null +++ b/vendor/github.com/aktau/github-release/commit.go @@ -0,0 +1,6 @@ +package main + +type Commit struct { + Sha string `json:"sha"` + Url string `json:"url"` +} diff --git a/vendor/github.com/aktau/github-release/error.go b/vendor/github.com/aktau/github-release/error.go new file mode 100644 index 0000000..9960b63 --- /dev/null +++ b/vendor/github.com/aktau/github-release/error.go @@ -0,0 +1,42 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "strings" +) + +/* usually when something goes wrong, github sends something like this back */ +type Message struct { + Message string `json:"message"` + Errors []GithubError `json:"errors"` +} + +type GithubError struct { + Resource string `json:"resource"` + Code string `json:"code"` + Field string `json:"field"` +} + +/* transforms a stream into a Message, if it's valid json */ +func ToMessage(r io.Reader) (*Message, error) { + var msg Message + if err := json.NewDecoder(r).Decode(&msg); err != nil { + return nil, err + } + + return &msg, nil +} + +func (m *Message) String() string { + str := fmt.Sprintf("msg: %v, errors: ", m.Message) + + errstr := make([]string, len(m.Errors)) + for idx, err := range m.Errors { + errstr[idx] = fmt.Sprintf("[field: %v, code: %v]", + err.Field, err.Code) + } + + return str + strings.Join(errstr, ", ") +} diff --git a/vendor/github.com/aktau/github-release/github-release.go b/vendor/github.com/aktau/github-release/github-release.go new file mode 100644 index 0000000..9c6f27c --- /dev/null +++ b/vendor/github.com/aktau/github-release/github-release.go @@ -0,0 +1,130 @@ +package main + +import ( + "fmt" + "os" + + "github.com/aktau/github-release/github" + "github.com/voxelbrain/goptions" +) + +const GH_URL = "https://github.com" + +type Options struct { + Help goptions.Help `goptions:"-h, --help, description='Show this help'"` + Verbosity []bool `goptions:"-v, --verbose, description='Be verbose'"` + Quiet bool `goptions:"-q, --quiet, description='Do not print anything, even errors (except if --verbose is specified)'"` + Version bool `goptions:"--version, description='Print version'"` + + goptions.Verbs + Download struct { + Token string `goptions:"-s, --security-token, description='Github token ($GITHUB_TOKEN if set). required if repo is private.'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Latest bool `goptions:"-l, --latest, description='Download latest release (required if tag is not specified)',mutexgroup='input'"` + Tag string `goptions:"-t, --tag, description='Git tag to download from (required if latest is not specified)', mutexgroup='input',obligatory"` + Name string `goptions:"-n, --name, description='Name of the file', obligatory"` + } `goptions:"download"` + Upload struct { + Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Tag string `goptions:"-t, --tag, description='Git tag to upload to', obligatory"` + Name string `goptions:"-n, --name, description='Name of the file', obligatory"` + Label string `goptions:"-l, --label, description='Label (description) of the file'"` + File *os.File `goptions:"-f, --file, description='File to upload (use - for stdin)', rdonly, obligatory"` + Replace bool `goptions:"-R, --replace, description='Replace asset with same name if it already exists (WARNING: not atomic, failure to upload will remove the original asset too)'"` + } `goptions:"upload"` + Release struct { + Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Tag string `goptions:"-t, --tag, obligatory, description='Git tag to create a release from'"` + Name string `goptions:"-n, --name, description='Name of the release (defaults to tag)'"` + Desc string `goptions:"-d, --description, description='Release description, use - for reading a description from stdin (defaults to tag)'"` + Target string `goptions:"-c, --target, description='Commit SHA or branch to create release of (defaults to the repository default branch)'"` + Draft bool `goptions:"--draft, description='The release is a draft'"` + Prerelease bool `goptions:"-p, --pre-release, description='The release is a pre-release'"` + } `goptions:"release"` + Edit struct { + Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Tag string `goptions:"-t, --tag, obligatory, description='Git tag to edit the release of'"` + Name string `goptions:"-n, --name, description='New name of the release (defaults to tag)'"` + Desc string `goptions:"-d, --description, description='New release description, use - for reading a description from stdin (defaults to tag)'"` + Draft bool `goptions:"--draft, description='The release is a draft'"` + Prerelease bool `goptions:"-p, --pre-release, description='The release is a pre-release'"` + } `goptions:"edit"` + Delete struct { + Token string `goptions:"-s, --security-token, description='Github token (required if $GITHUB_TOKEN not set)'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Tag string `goptions:"-t, --tag, obligatory, description='Git tag of release to delete'"` + } `goptions:"delete"` + Info struct { + Token string `goptions:"-s, --security-token, description='Github token ($GITHUB_TOKEN if set). required if repo is private.'"` + User string `goptions:"-u, --user, description='Github repo user or organisation (required if $GITHUB_USER not set)'"` + Repo string `goptions:"-r, --repo, description='Github repo (required if $GITHUB_REPO not set)'"` + Tag string `goptions:"-t, --tag, description='Git tag to query (optional)'"` + JSON bool `goptions:"-j, --json, description='Emit info as JSON instead of text'"` + } `goptions:"info"` +} + +type Command func(Options) error + +var commands = map[goptions.Verbs]Command{ + "download": downloadcmd, + "upload": uploadcmd, + "release": releasecmd, + "edit": editcmd, + "delete": deletecmd, + "info": infocmd, +} + +var ( + VERBOSITY = 0 +) + +var ( + EnvToken string + EnvUser string + EnvRepo string + EnvApiEndpoint string +) + +func init() { + EnvToken = os.Getenv("GITHUB_TOKEN") + EnvUser = os.Getenv("GITHUB_USER") + EnvRepo = os.Getenv("GITHUB_REPO") + EnvApiEndpoint = os.Getenv("GITHUB_API") +} + +func main() { + options := Options{} + + goptions.ParseAndFail(&options) + + if options.Version { + fmt.Printf("github-release v%s\n", VERSION) + return + } + + if len(options.Verbs) == 0 { + goptions.PrintHelp() + return + } + + VERBOSITY = len(options.Verbosity) + github.VERBOSITY = VERBOSITY + + if cmd, found := commands[options.Verbs]; found { + err := cmd(options) + if err != nil { + if !options.Quiet { + fmt.Fprintln(os.Stderr, "error:", err) + } + os.Exit(1) + } + } +} diff --git a/vendor/github.com/aktau/github-release/github/debug.go b/vendor/github.com/aktau/github-release/github/debug.go new file mode 100644 index 0000000..f139607 --- /dev/null +++ b/vendor/github.com/aktau/github-release/github/debug.go @@ -0,0 +1,22 @@ +package github + +import ( + "fmt" + "os" +) + +func vprintln(a ...interface{}) (int, error) { + if VERBOSITY > 0 { + return fmt.Fprintln(os.Stderr, a...) + } + + return 0, nil +} + +func vprintf(format string, a ...interface{}) (int, error) { + if VERBOSITY > 0 { + return fmt.Fprintf(os.Stderr, format, a...) + } + + return 0, nil +} diff --git a/vendor/github.com/aktau/github-release/github/file.go b/vendor/github.com/aktau/github-release/github/file.go new file mode 100644 index 0000000..8f503b6 --- /dev/null +++ b/vendor/github.com/aktau/github-release/github/file.go @@ -0,0 +1,79 @@ +package github + +import ( + "bytes" + "errors" + "fmt" + "io" + "os" +) + +func GetFileSize(f *os.File) (int64, error) { + /* first try stat */ + off, err := fsizeStat(f) + if err != nil { + /* if that fails, try seek */ + return fsizeSeek(f) + } + + return off, nil +} + +func fsizeStat(f *os.File) (int64, error) { + fi, err := f.Stat() + + if err != nil { + return 0, err + } + + return fi.Size(), nil +} + +func fsizeSeek(f *os.File) (int64, error) { + off, err := f.Seek(0, 2) + if err != nil { + return 0, fmt.Errorf("seeking did not work, stdin is not" + + "supported yet because github doesn't support chunking" + + "requests (and I haven't implemented detecting stdin and" + + "buffering yet") + } + + _, err = f.Seek(0, 0) + if err != nil { + return 0, fmt.Errorf("could not seek back in the file") + } + return off, nil +} + +// materializeFile takes a physical file or stream (named pipe, user input, +// ...) and returns an io.Reader and the number of bytes that can be read +// from it. +func materializeFile(f *os.File) (io.Reader, int64, error) { + fi, err := f.Stat() + if err != nil { + return nil, 0, err + } + + // If the file is actually a char device (like user typed input) + // or a named pipe (like a streamed in file), buffer it up. + // + // When uploading a file, you need to either explicitly set the + // Content-Length header or send a chunked request. Since the + // github upload server doesn't accept chunked encoding, we have + // to set the size of the file manually. Since a stream doesn't have a + // predefined length, it's read entirely into a byte buffer. + if fi.Mode()&(os.ModeCharDevice|os.ModeNamedPipe) == 1 { + vprintln("input was a stream, buffering up") + + var buf bytes.Buffer + n, err := buf.ReadFrom(f) + if err != nil { + return nil, 0, errors.New("req: could not buffer up input stream: " + err.Error()) + } + return &buf, n, err + } + + // We know the os.File is most likely an actual file now. + n, err := GetFileSize(f) + return f, n, err +} diff --git a/vendor/github.com/aktau/github-release/github/github.go b/vendor/github.com/aktau/github-release/github/github.go new file mode 100644 index 0000000..8fe7233 --- /dev/null +++ b/vendor/github.com/aktau/github-release/github/github.go @@ -0,0 +1,277 @@ +// Package github is a mini-library for querying the GitHub v3 API that +// takes care of authentication (with tokens only) and pagination. +package github + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "os" + "reflect" + + "github.com/tomnomnom/linkheader" +) + +const DefaultBaseURL = "https://api.github.com" + +// Set to values > 0 to control verbosity, for debugging. +var VERBOSITY = 0 + +// DoAuthRequest ... +// +// TODO: This function is amazingly ugly (separate headers, token, no API +// URL constructions, et cetera). +func DoAuthRequest(method, url, mime, token string, headers map[string]string, body io.Reader) (*http.Response, error) { + req, err := newAuthRequest(method, url, mime, token, headers, body) + if err != nil { + return nil, err + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + + return resp, nil +} + +// Client collects a few options that can be set when contacting the GitHub +// API, such as authorization tokens. Methods called on Client will supply +// these options when calling the API. +type Client struct { + Token string // Github API token, used when set. + BaseURL string // Github API URL, defaults to DefaultBaseURL if unset. +} + +// Get fetches uri (relative URL) from the GitHub API and unmarshals the +// response into v. It takes care of pagination transparantly. +func (c Client) Get(uri string, v interface{}) error { + if c.BaseURL == "" { + c.BaseURL = DefaultBaseURL + } + rc, err := c.getPaginated(uri) + if err != nil { + return err + } + defer rc.Close() + var r io.Reader = rc + if VERBOSITY > 0 { + vprintln("BODY:") + r = io.TeeReader(rc, os.Stderr) + } + + // Github may return paginated responses. If so, githubGetPaginated will + // return a reader which yields the concatenation of all pages. These + // reponses are _separate_ JSON arrays. Standard json.Unmarshal() or + // json.Decoder.Decode() will not have the expected result when + // unmarshalling into v. For example, a 2-page response: + // + // 1. [{...}, {...}, {...}] + // 2. [{...}] + // + // If v is a slice type, we'd like to decode the four objects from the + // two pages into a single slice. However, if we just use + // json.Decoder.Decode(), that won't work. v will be overridden each + // time. + // + // For this reason, we use two very ugly things. + // + // 1. We analyze v with reflect to see if it's a slice. + // 2. If so, we use the json.Decoder token API and reflection to + // dynamically add new elements into the slice, ignoring the + // boundaries between JSON arrays. + // + // This is a lot of work, and feels very stupid. An alternative would be + // removing the outermost ][ in the intermediate responses, which would + // be even more finnicky. Another alternative would be to explicitly + // expose a pagination API, forcing clients of this code to deal with + // it. That's how the go-github library does it. But why solve a problem + // sensibly if one can power through it with reflection (half-joking)? + + sl := reflect.Indirect(reflect.ValueOf(v)) // Get the reflect.Value of the slice so we can append to it. + t := sl.Type() + if t.Kind() != reflect.Slice { + // Not a slice, not going to handle special pagination JSON stream + // semantics since it likely wouldn't work properly anyway. If this + // is a non-paginated stream, it should work. + return json.NewDecoder(r).Decode(v) + } + t = t.Elem() // Extract the type of the slice's elements. + + // Use streaming Token API to append all elements of the JSON stream + // arrays (pagination) to the slice. + for dec := json.NewDecoder(r); ; { + tok, err := dec.Token() + if err != nil { + if err == io.EOF { + return nil // Natural end of the JSON stream. + } + return err + } + vprintf("TOKEN %T: %v\n", tok, tok) + // Check for tokens until we get an opening array brace. If we're + // not in an array, we can't decode an array element later, which + // would result in an error. + if tok != json.Delim('[') { + continue + } + + // Read the array, appending all elements to the slice. + for dec.More() { + it := reflect.New(t) // Interface to a valid pointer to an object of the same type as the slice elements. + vprintf("OBJECT %T: %v\n", it, it) + if err := dec.Decode(it.Interface()); err != nil { + return err + } + sl.Set(reflect.Append(sl, it.Elem())) + } + } +} + +// getPaginated returns a reader that yields the concatenation of the +// paginated responses to a query (URI). +// +// TODO: Rework the API so we can cleanly append per_page=100 as a URL +// parameter. +func (c Client) getPaginated(uri string) (io.ReadCloser, error) { + // Parse the passed-in URI to make sure we don't lose any values when + // setting our own params. + u, err := url.Parse(c.BaseURL + uri) + if err != nil { + return nil, err + } + + v := u.Query() + v.Set("per_page", "100") // The default is 30, this makes it less likely for Github to rate-limit us. + if c.Token != "" { + v.Set("access_token", c.Token) + } + u.RawQuery = v.Encode() + resp, err := http.Get(u.String()) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + resp.Body.Close() + return nil, fmt.Errorf("expected '200 OK' but received '%v' (url: %s)", resp.Status, resp.Request.URL) + } + vprintln("GET (top-level)", resp.Request.URL, "->", resp) + + // If the HTTP response is paginated, it will contain a Link header. + links := linkheader.Parse(resp.Header.Get("Link")) + if len(links) == 0 { + return resp.Body, nil // No pagination. + } + + // In this case, fetch all pages and concatenate them. + r, w := io.Pipe() + done := make(chan struct{}) // Backpressure from the pipe writer. + responses := make(chan *http.Response, 5) // Allow 5 concurrent HTTP requests. + responses <- resp + + // URL fetcher goroutine. Fetches paginated responses until no more + // pages can be found. Closes the write end of the pipe if fetching a + // page fails. + go func() { + defer close(responses) // Signal that no more requests are coming. + for len(links) > 0 { + URL := nextLink(links) + if URL == "" { + return // We're done. + } + + resp, err := http.Get(URL) + links = linkheader.Parse(resp.Header.Get("Link")) + if err != nil { + w.CloseWithError(err) + return + } + select { + case <-done: + return // The body concatenator goroutine signals it has stopped. + case responses <- resp: // Schedule the request body to be written to the pipe. + } + } + }() + + // Body concatenator goroutine. Writes each response into the pipe + // sequentially. Closes the write end of the pipe if the HTTP status is + // not 200 or the body can't be read. + go func() { + defer func() { + // Drain channel and close bodies, stop leaks. + for resp := range responses { + resp.Body.Close() + } + }() + defer close(done) // Signal that we're done writing all requests, or an error occurred. + for resp := range responses { + if resp.StatusCode != http.StatusOK { + resp.Body.Close() + w.CloseWithError(fmt.Errorf("expected '200 OK' but received '%v' (url: %s)", resp.Status, resp.Request.URL)) + return + } + _, err := io.Copy(w, resp.Body) + resp.Body.Close() + if err != nil { + vprintln("error: io.Copy: ", err) + w.CloseWithError(err) + return + } + } + w.Close() + }() + + return r, nil +} + +// Create a new request that sends the auth token. +func newAuthRequest(method, url, mime, token string, headers map[string]string, body io.Reader) (*http.Request, error) { + vprintln("creating request:", method, url, mime, token) + + var n int64 // content length + var err error + if f, ok := body.(*os.File); ok { + // Retrieve the content-length and buffer up if necessary. + body, n, err = materializeFile(f) + if err != nil { + return nil, err + } + } + + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, err + } + + // net/http automatically does this if req.Body is of type + // (bytes.Reader|bytes.Buffer|strings.Reader). Sadly, we also need to + // handle *os.File. + if n != 0 { + vprintln("setting content-length to", n) + req.ContentLength = n + } + + if mime != "" { + req.Header.Set("Content-Type", mime) + } + req.Header.Set("Authorization", "token "+token) + + for k, v := range headers { + req.Header.Set(k, v) + } + + return req, nil +} + +// nextLink returns the HTTP header Link annotated with 'next', "" otherwise. +func nextLink(links linkheader.Links) string { + for _, link := range links { + if link.Rel == "next" && link.URL != "" { + return link.URL + } + } + return "" +} diff --git a/vendor/github.com/aktau/github-release/releases.go b/vendor/github.com/aktau/github-release/releases.go new file mode 100644 index 0000000..bc8cf9b --- /dev/null +++ b/vendor/github.com/aktau/github-release/releases.go @@ -0,0 +1,137 @@ +package main + +import ( + "fmt" + "strings" + "time" + + "github.com/aktau/github-release/github" + "github.com/dustin/go-humanize" +) + +const ( + RELEASE_LIST_URI = "/repos/%s/%s/releases" + RELEASE_LATEST_URI = "/repos/%s/%s/releases/latest" + RELEASE_DATE_FORMAT = "02/01/2006 at 15:04" +) + +type Release struct { + Url string `json:"url"` + PageUrl string `json:"html_url"` + UploadUrl string `json:"upload_url"` + Id int `json:"id"` + Name string `json:"name"` + Description string `json:"body"` + TagName string `json:"tag_name"` + Draft bool `json:"draft"` + Prerelease bool `json:"prerelease"` + Created *time.Time `json:"created_at"` + Published *time.Time `json:"published_at"` + Assets []Asset `json:"assets"` +} + +func (r *Release) CleanUploadUrl() string { + bracket := strings.Index(r.UploadUrl, "{") + + if bracket == -1 { + return r.UploadUrl + } + + return r.UploadUrl[0:bracket] +} + +func (r *Release) String() string { + str := make([]string, len(r.Assets)+1) + str[0] = fmt.Sprintf( + "%s, name: '%s', description: '%s', id: %d, tagged: %s, published: %s, draft: %v, prerelease: %v", + r.TagName, r.Name, r.Description, r.Id, + timeFmtOr(r.Created, RELEASE_DATE_FORMAT, ""), + timeFmtOr(r.Published, RELEASE_DATE_FORMAT, ""), + Mark(r.Draft), Mark(r.Prerelease)) + + for idx, asset := range r.Assets { + str[idx+1] = fmt.Sprintf(" - artifact: %s, downloads: %d, state: %s, type: %s, size: %s, id: %d", + asset.Name, asset.Downloads, asset.State, asset.ContentType, + humanize.Bytes(asset.Size), asset.Id) + } + + return strings.Join(str, "\n") +} + +type ReleaseCreate struct { + TagName string `json:"tag_name"` + TargetCommitish string `json:"target_commitish,omitempty"` + Name string `json:"name"` + Body string `json:"body"` + Draft bool `json:"draft"` + Prerelease bool `json:"prerelease"` +} + +func Releases(user, repo, token string) ([]Release, error) { + var releases []Release + err := github.Client{Token: token, BaseURL: EnvApiEndpoint}.Get(fmt.Sprintf(RELEASE_LIST_URI, user, repo), &releases) + if err != nil { + return nil, err + } + + return releases, nil +} + +func latestReleaseApi(user, repo, token string) (*Release, error) { + var release Release + return &release, github.Client{Token: token, BaseURL: EnvApiEndpoint}.Get(fmt.Sprintf(RELEASE_LATEST_URI, user, repo), &release) +} + +func LatestRelease(user, repo, token string) (*Release, error) { + // If latestReleaseApi DOESN'T give an error, return the release. + if latestRelease, err := latestReleaseApi(user, repo, token); err == nil { + return latestRelease, nil + } + + // The enterprise api doesnt support the latest release endpoint. Get + // all releases and compare the published date to get the latest. + releases, err := Releases(user, repo, token) + if err != nil { + return nil, err + } + + var latestRelIndex = -1 + maxDate := time.Time{} + for i, release := range releases { + if relDate := *release.Published; relDate.After(maxDate) { + maxDate = relDate + latestRelIndex = i + } + } + if latestRelIndex == -1 { + return nil, fmt.Errorf("could not find the latest release") + } + + vprintln("Scanning ", len(releases), "releases, latest release is", releases[latestRelIndex]) + return &releases[latestRelIndex], nil +} + +func ReleaseOfTag(user, repo, tag, token string) (*Release, error) { + releases, err := Releases(user, repo, token) + if err != nil { + return nil, err + } + + for _, release := range releases { + if release.TagName == tag { + return &release, nil + } + } + + return nil, fmt.Errorf("could not find the release corresponding to tag %s", tag) +} + +/* find the release-id of the specified tag */ +func IdOfTag(user, repo, tag, token string) (int, error) { + release, err := ReleaseOfTag(user, repo, tag, token) + if err != nil { + return 0, err + } + + return release.Id, nil +} diff --git a/vendor/github.com/aktau/github-release/tags.go b/vendor/github.com/aktau/github-release/tags.go new file mode 100644 index 0000000..29c539e --- /dev/null +++ b/vendor/github.com/aktau/github-release/tags.go @@ -0,0 +1,28 @@ +package main + +import ( + "fmt" + + "github.com/aktau/github-release/github" +) + +const ( + TAGS_URI = "/repos/%s/%s/tags" +) + +type Tag struct { + Name string `json:"name"` + Commit Commit `json:"commit"` + ZipBallUrl string `json:"zipball_url"` + TarBallUrl string `json:"tarball_url"` +} + +func (t *Tag) String() string { + return t.Name + " (commit: " + t.Commit.Url + ")" +} + +// Get the tags associated with a repo. +func Tags(user, repo, token string) ([]Tag, error) { + var tags []Tag + return tags, github.Client{Token: token, BaseURL: EnvApiEndpoint}.Get(fmt.Sprintf(TAGS_URI, user, repo), &tags) +} diff --git a/vendor/github.com/aktau/github-release/term.go b/vendor/github.com/aktau/github-release/term.go new file mode 100644 index 0000000..700ff48 --- /dev/null +++ b/vendor/github.com/aktau/github-release/term.go @@ -0,0 +1,9 @@ +package main + +func Mark(ok bool) string { + if ok { + return "✔" + } else { + return "✗" + } +} diff --git a/vendor/github.com/aktau/github-release/util.go b/vendor/github.com/aktau/github-release/util.go new file mode 100644 index 0000000..8ff90eb --- /dev/null +++ b/vendor/github.com/aktau/github-release/util.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "os" + "time" +) + +/* oracle nvl, return first non-empty string */ +func nvls(xs ...string) string { + for _, s := range xs { + if s != "" { + return s + } + } + + return "" +} + +func vprintln(a ...interface{}) (int, error) { + if VERBOSITY > 0 { + return fmt.Fprintln(os.Stderr, a...) + } + + return 0, nil +} + +func vprintf(format string, a ...interface{}) (int, error) { + if VERBOSITY > 0 { + return fmt.Fprintf(os.Stderr, format, a...) + } + + return 0, nil +} + +// formats time `t` as `fmt` if it is not nil, otherwise returns `def` +func timeFmtOr(t *time.Time, fmt, def string) string { + if t == nil { + return def + } + return t.Format(fmt) +} + +// isCharDevice returns true if f is a character device (panics if f can't +// be stat'ed). +func isCharDevice(f *os.File) bool { + stat, err := f.Stat() + if err != nil { + panic(err) + } + return (stat.Mode() & os.ModeCharDevice) != 0 +} diff --git a/vendor/github.com/aktau/github-release/version.go b/vendor/github.com/aktau/github-release/version.go new file mode 100644 index 0000000..0b53fc5 --- /dev/null +++ b/vendor/github.com/aktau/github-release/version.go @@ -0,0 +1,3 @@ +package main + +const VERSION = "0.7.2" diff --git a/vendor/github.com/containous/go-bindata/.gitignore b/vendor/github.com/containous/go-bindata/.gitignore new file mode 100644 index 0000000..730939a --- /dev/null +++ b/vendor/github.com/containous/go-bindata/.gitignore @@ -0,0 +1,3 @@ +.idea/ +vendor/ +dist/ \ No newline at end of file diff --git a/vendor/github.com/containous/go-bindata/.travis.yml b/vendor/github.com/containous/go-bindata/.travis.yml new file mode 100644 index 0000000..1b67834 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/.travis.yml @@ -0,0 +1,18 @@ +language: go + +go: + - 1.x + +install: + - echo "TRAVIS_GO_VERSION=$TRAVIS_GO_VERSION" + +deploy: + - provider: releases + api_key: ${GITHUB_TOKEN} + file: dist/go-bindata + skip_cleanup: true + overwrite: true + file_glob: true + on: + tags: true + condition: $TRAVIS_GO_VERSION =~ ^1\.x$ diff --git a/vendor/github.com/containous/go-bindata/CONTRIBUTING.md b/vendor/github.com/containous/go-bindata/CONTRIBUTING.md new file mode 100644 index 0000000..e0732f5 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/CONTRIBUTING.md @@ -0,0 +1,79 @@ +## Contribution guidelines. + +So you wish to contribute to this project? Fantastic! +Here are a few guidelines to help you do this in a +streamlined fashion. + + +## Bug reports + +When supplying a bug report, please consider the following guidelines. +These serve to make it easier for us to address the issue and find a solution. +Most of these are pretty self-evident, but sometimes it is still necessary +to reiterate them. + +* Be clear in the way you express the problem. Use simple language and + just enough of it to clearly define the issue. Not everyone is a native + English speaker. And while most can handle themselves pretty well, + it helps to stay away from more esoteric vocabulary. + + Be patient with non-native English speakers. If their bug reports + or comments are hard to understand, just ask for clarification. + Do not start guessing at their meaning, as this may just lead to + more confusion and misunderstandings. +* Clearly define any information which is relevant to the problem. + This includes library versions, operating system and any other + external dependencies which may be needed. +* Where applicable, provide a step-by-step listing of the way to + reproduce the problem. Make sure this is the simplest possible + way to do so. Omit any and all unneccesary steps, because they may + just complicate our understanding of the real problem. + If need be, create a whole new code project on your local machine, + which specifically tries to create the problem you are running into; + nothing more, nothing less. + + Include this program in the bug report. It often suffices to paste + the code in a [Gist](https://gist.github.com) or on the + [Go playground](http://play.golang.org). +* If possible, provide us with a listing of the steps you have already + undertaken to solve the problem. This can save us a great deal of + wasted time, trying out solutions you have already covered. + + +## Pull requests + +Bug reports are great. Supplying fixes to bugs is even better. +When submitting a pull request, the following guidelines are +good to keep in mind: + +* `go fmt`: **Always** run your code through `go fmt`, before + committing it. Code has to be readable by many different + people. And the only way this will be as painless as possible, + is if we all stick to the same code style. + + Some of our projects may have automated build-servers hooked up + to commit hooks. These will vet any submitted code and determine + if it meets a set of properties. One of which is code formatting. + These servers will outright deny a submission which has not been + run through `go fmt`, even if the code itself is correct. + + We try to maintain a zero-tolerance policy on this matter, + because consistently formatted code makes life a great deal + easier for everyone involved. +* Commit log messages: When committing changes, do so often and + clearly -- Even if you have changed only 1 character in a code + comment. This means that commit log messages should clearly state + exactly what the change does and why. If it fixes a known issue, + then mention the issue number in the commit log. E.g.: + + > Fixes return value for `foo/boo.Baz()` to be consistent with + > the rest of the API. This addresses issue #32 + + Do not pile a lot of unrelated changes into a single commit. + Pick and choose only those changes for a single commit, which are + directly related. We would much rather see a hundred commits + saying nothing but `"Runs go fmt"` in between any real fixes + than have these style changes embedded in those real fixes. + It creates a lot of noise when trying to review code. + + diff --git a/vendor/github.com/containous/go-bindata/LICENSE b/vendor/github.com/containous/go-bindata/LICENSE new file mode 100644 index 0000000..c07a931 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/LICENSE @@ -0,0 +1,3 @@ +This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +license. Its contents can be found at: +http://creativecommons.org/publicdomain/zero/1.0 diff --git a/vendor/github.com/containous/go-bindata/Makefile b/vendor/github.com/containous/go-bindata/Makefile new file mode 100644 index 0000000..3af68f9 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/Makefile @@ -0,0 +1,31 @@ +.PHONY: all clean checks test build image dependencies + +SRCS = $(shell git ls-files '*.go' | grep -v '^vendor/') + +MAIN_DIRECTORY := ./go-bindata/ +BIN_OUTPUT := dist/go-bindata + +TAG_NAME := $(shell git tag -l --contains HEAD) +SHA := $(shell git rev-parse HEAD) +VERSION := $(if $(TAG_NAME),$(TAG_NAME),$(SHA)) + +default: clean test build + +clean: + rm -rf dist/ builds/ cover.out + +build: clean + @echo Version: $(VERSION) + go build -v -ldflags '-X "main.AppVersion=${VERSION}"' -o ${BIN_OUTPUT} ${MAIN_DIRECTORY} + +dependencies: + dep ensure -v + +test: clean + go test -v -cover ./... + +testdata: + make -C testdata + +fmt: + gofmt -s -l -w $(SRCS) diff --git a/vendor/github.com/containous/go-bindata/README.md b/vendor/github.com/containous/go-bindata/README.md new file mode 100644 index 0000000..6b4cd32 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/README.md @@ -0,0 +1,197 @@ +## IMPORTANT + +**This a copy of https://github.com/jteeuwen/go-bindata/ due to the disappearance of https://github.com/jteeuwen on GitHub.** + +The original code is in the branch [jteeuwen](https://github.com/containous/go-bindata/tree/jteeuwen). + +In the branch `master`, we have only change some imports to be working with `go get`. + +## bindata + +This package converts any file into managable Go source code. Useful for +embedding binary data into a go program. The file data is optionally gzip +compressed before being converted to a raw byte slice. + +It comes with a command line tool in the `go-bindata` sub directory. +This tool offers a set of command line options, used to customize the +output being generated. + + +### Installation + +To install the library and command line program, use the following: + + go get -u github.com/containous/go-bindata/... + + +### Usage + +Conversion is done on one or more sets of files. They are all embedded in a new +Go source file, along with a table of contents and an `Asset` function, +which allows quick access to the asset, based on its name. + +The simplest invocation generates a `bindata.go` file in the current +working directory. It includes all assets from the `data` directory. + + $ go-bindata data/ + +To include all input sub-directories recursively, use the elipsis postfix +as defined for Go import paths. Otherwise it will only consider assets in the +input directory itself. + + $ go-bindata data/... + +To specify the name of the output file being generated, we use the following: + + $ go-bindata -o myfile.go data/ + +Multiple input directories can be specified if necessary. + + $ go-bindata dir1/... /path/to/dir2/... dir3 + + +The following paragraphs detail some of the command line options which can be +supplied to `go-bindata`. Refer to the `testdata/out` directory for various +output examples from the assets in `testdata/in`. Each example uses different +command line options. + +To ignore files, pass in regexes using -ignore, for example: + + $ go-bindata -ignore=\\.gitignore data/... + +### Accessing an asset + +To access asset data, we use the `Asset(string) ([]byte, error)` function which +is included in the generated output. + + data, err := Asset("pub/style/foo.css") + if err != nil { + // Asset was not found. + } + + // use asset data + + +### Debug vs Release builds + +When invoking the program with the `-debug` flag, the generated code does +not actually include the asset data. Instead, it generates function stubs +which load the data from the original file on disk. The asset API remains +identical between debug and release builds, so your code will not have to +change. + +This is useful during development when you expect the assets to change often. +The host application using these assets uses the same API in both cases and +will not have to care where the actual data comes from. + +An example is a Go webserver with some embedded, static web content like +HTML, JS and CSS files. While developing it, you do not want to rebuild the +whole server and restart it every time you make a change to a bit of +javascript. You just want to build and launch the server once. Then just press +refresh in the browser to see those changes. Embedding the assets with the +`debug` flag allows you to do just that. When you are finished developing and +ready for deployment, just re-invoke `go-bindata` without the `-debug` flag. +It will now embed the latest version of the assets. + + +### Lower memory footprint + +Using the `-nomemcopy` flag, will alter the way the output file is generated. +It will employ a hack that allows us to read the file data directly from +the compiled program's `.rodata` section. This ensures that when we call +call our generated function, we omit unnecessary memcopies. + +The downside of this, is that it requires dependencies on the `reflect` and +`unsafe` packages. These may be restricted on platforms like AppEngine and +thus prevent you from using this mode. + +Another disadvantage is that the byte slice we create, is strictly read-only. +For most use-cases this is not a problem, but if you ever try to alter the +returned byte slice, a runtime panic is thrown. Use this mode only on target +platforms where memory constraints are an issue. + +The default behaviour is to use the old code generation method. This +prevents the two previously mentioned issues, but will employ at least one +extra memcopy and thus increase memory requirements. + +For instance, consider the following two examples: + +This would be the default mode, using an extra memcopy but gives a safe +implementation without dependencies on `reflect` and `unsafe`: + +```go +func myfile() []byte { + return []byte{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a} +} +``` + +Here is the same functionality, but uses the `.rodata` hack. +The byte slice returned from this example can not be written to without +generating a runtime error. + +```go +var _myfile = "\x89\x50\x4e\x47\x0d\x0a\x1a" + +func myfile() []byte { + var empty [0]byte + sx := (*reflect.StringHeader)(unsafe.Pointer(&_myfile)) + b := empty[:] + bx := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bx.Data = sx.Data + bx.Len = len(_myfile) + bx.Cap = bx.Len + return b +} +``` + + +### Optional compression + +When the `-nocompress` flag is given, the supplied resource is *not* GZIP +compressed before being turned into Go code. The data should still be accessed +through a function call, so nothing changes in the usage of the generated file. + +This feature is useful if you do not care for compression, or the supplied +resource is already compressed. Doing it again would not add any value and may +even increase the size of the data. + +The default behaviour of the program is to use compression. + + +### Path prefix stripping + +The keys used in the `_bindata` map, are the same as the input file name +passed to `go-bindata`. This includes the path. In most cases, this is not +desireable, as it puts potentially sensitive information in your code base. +For this purpose, the tool supplies another command line flag `-prefix`. +This accepts a portion of a path name, which should be stripped off from +the map keys and function names. + +For example, running without the `-prefix` flag, we get: + + $ go-bindata /path/to/templates/ + + _bindata["/path/to/templates/foo.html"] = path_to_templates_foo_html + +Running with the `-prefix` flag, we get: + + $ go-bindata -prefix "/path/to/" /path/to/templates/ + + _bindata["templates/foo.html"] = templates_foo_html + + +### Build tags + +With the optional `-tags` flag, you can specify any go build tags that +must be fulfilled for the output file to be included in a build. This +is useful when including binary data in multiple formats, where the desired +format is specified at build time with the appropriate tags. + +The tags are appended to a `// +build` line in the beginning of the output file +and must follow the build tags syntax specified by the go tool. + +### Related projects + +[go-bindata-assetfs](https://github.com/elazarl/go-bindata-assetfs#readme) - +implements `http.FileSystem` interface. Allows you to serve assets with `net/http`. + diff --git a/vendor/github.com/containous/go-bindata/asset.go b/vendor/github.com/containous/go-bindata/asset.go new file mode 100644 index 0000000..95b6b94 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/asset.go @@ -0,0 +1,12 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +// Asset holds information about a single asset to be processed. +type Asset struct { + Path string // Full file path. + Name string // Key used in TOC -- name by which asset is referenced. + Func string // Function name for the procedure returning the asset contents. +} diff --git a/vendor/github.com/containous/go-bindata/bytewriter.go b/vendor/github.com/containous/go-bindata/bytewriter.go new file mode 100644 index 0000000..05d6d67 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/bytewriter.go @@ -0,0 +1,44 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "fmt" + "io" +) + +var ( + newline = []byte{'\n'} + dataindent = []byte{'\t', '\t'} + space = []byte{' '} +) + +type ByteWriter struct { + io.Writer + c int +} + +func (w *ByteWriter) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return + } + + for n = range p { + if w.c%12 == 0 { + w.Writer.Write(newline) + w.Writer.Write(dataindent) + w.c = 0 + } else { + w.Writer.Write(space) + } + + fmt.Fprintf(w.Writer, "0x%02x,", p[n]) + w.c++ + } + + n++ + + return +} diff --git a/vendor/github.com/containous/go-bindata/config.go b/vendor/github.com/containous/go-bindata/config.go new file mode 100644 index 0000000..f40bef1 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/config.go @@ -0,0 +1,203 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "fmt" + "os" + "path/filepath" + "regexp" +) + +// InputConfig defines options on a asset directory to be convert. +type InputConfig struct { + // Path defines a directory containing asset files to be included + // in the generated output. + Path string + + // Recursive defines whether subdirectories of Path + // should be recursively included in the conversion. + Recursive bool +} + +// Config defines a set of options for the asset conversion. +type Config struct { + // Name of the package to use. Defaults to 'main'. + Package string + + // Tags specify a set of optional build tags, which should be + // included in the generated output. The tags are appended to a + // `// +build` line in the beginning of the output file + // and must follow the build tags syntax specified by the go tool. + Tags string + + // Input defines the directory path, containing all asset files as + // well as whether to recursively process assets in any sub directories. + Input []InputConfig + + // Output defines the output file for the generated code. + // If left empty, this defaults to 'bindata.go' in the current + // working directory. + Output string + + // Prefix defines a path prefix which should be stripped from all + // file names when generating the keys in the table of contents. + // For example, running without the `-prefix` flag, we get: + // + // $ go-bindata /path/to/templates + // go_bindata["/path/to/templates/foo.html"] = _path_to_templates_foo_html + // + // Running with the `-prefix` flag, we get: + // + // $ go-bindata -prefix "/path/to/" /path/to/templates/foo.html + // go_bindata["templates/foo.html"] = templates_foo_html + Prefix string + + // NoMemCopy will alter the way the output file is generated. + // + // It will employ a hack that allows us to read the file data directly from + // the compiled program's `.rodata` section. This ensures that when we call + // call our generated function, we omit unnecessary mem copies. + // + // The downside of this, is that it requires dependencies on the `reflect` and + // `unsafe` packages. These may be restricted on platforms like AppEngine and + // thus prevent you from using this mode. + // + // Another disadvantage is that the byte slice we create, is strictly read-only. + // For most use-cases this is not a problem, but if you ever try to alter the + // returned byte slice, a runtime panic is thrown. Use this mode only on target + // platforms where memory constraints are an issue. + // + // The default behaviour is to use the old code generation method. This + // prevents the two previously mentioned issues, but will employ at least one + // extra memcopy and thus increase memory requirements. + // + // For instance, consider the following two examples: + // + // This would be the default mode, using an extra memcopy but gives a safe + // implementation without dependencies on `reflect` and `unsafe`: + // + // func myfile() []byte { + // return []byte{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a} + // } + // + // Here is the same functionality, but uses the `.rodata` hack. + // The byte slice returned from this example can not be written to without + // generating a runtime error. + // + // var _myfile = "\x89\x50\x4e\x47\x0d\x0a\x1a" + // + // func myfile() []byte { + // var empty [0]byte + // sx := (*reflect.StringHeader)(unsafe.Pointer(&_myfile)) + // b := empty[:] + // bx := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + // bx.Data = sx.Data + // bx.Len = len(_myfile) + // bx.Cap = bx.Len + // return b + // } + NoMemCopy bool + + // NoCompress means the assets are /not/ GZIP compressed before being turned + // into Go code. The generated function will automatically unzip + // the file data when called. Defaults to false. + NoCompress bool + + // Perform a debug build. This generates an asset file, which + // loads the asset contents directly from disk at their original + // location, instead of embedding the contents in the code. + // + // This is mostly useful if you anticipate that the assets are + // going to change during your development cycle. You will always + // want your code to access the latest version of the asset. + // Only in release mode, will the assets actually be embedded + // in the code. The default behaviour is Release mode. + Debug bool + + // Perform a dev build, which is nearly identical to the debug option. The + // only difference is that instead of absolute file paths in generated code, + // it expects a variable, `rootDir`, to be set in the generated code's + // package (the author needs to do this manually), which it then prepends to + // an asset's name to construct the file path on disk. + // + // This is mainly so you can push the generated code file to a shared + // repository. + Dev bool + + // When true, size, mode and modtime are not preserved from files + NoMetadata bool + // When nonzero, use this as mode for all files. + Mode uint + // When nonzero, use this as unix timestamp for all files. + ModTime int64 + + // Ignores any filenames matching the regex pattern specified, e.g. + // path/to/file.ext will ignore only that file, or \\.gitignore + // will match any .gitignore file. + // + // This parameter can be provided multiple times. + Ignore []*regexp.Regexp +} + +// NewConfig returns a default configuration struct. +func NewConfig() *Config { + c := new(Config) + c.Package = "main" + c.NoMemCopy = false + c.NoCompress = false + c.Debug = false + c.Output = "./bindata.go" + c.Ignore = make([]*regexp.Regexp, 0) + return c +} + +// validate ensures the config has sane values. +// Part of which means checking if certain file/directory paths exist. +func (c *Config) validate() error { + if len(c.Package) == 0 { + return fmt.Errorf("Missing package name") + } + + for _, input := range c.Input { + _, err := os.Lstat(input.Path) + if err != nil { + return fmt.Errorf("Failed to stat input path '%s': %v", input.Path, err) + } + } + + if len(c.Output) == 0 { + cwd, err := os.Getwd() + if err != nil { + return fmt.Errorf("Unable to determine current working directory.") + } + + c.Output = filepath.Join(cwd, "bindata.go") + } + + stat, err := os.Lstat(c.Output) + if err != nil { + if !os.IsNotExist(err) { + return fmt.Errorf("Output path: %v", err) + } + + // File does not exist. This is fine, just make + // sure the directory it is to be in exists. + dir, _ := filepath.Split(c.Output) + if dir != "" { + err = os.MkdirAll(dir, 0744) + + if err != nil { + return fmt.Errorf("Create output directory: %v", err) + } + } + } + + if stat != nil && stat.IsDir() { + return fmt.Errorf("Output path is a directory.") + } + + return nil +} diff --git a/vendor/github.com/containous/go-bindata/convert.go b/vendor/github.com/containous/go-bindata/convert.go new file mode 100644 index 0000000..cf0466e --- /dev/null +++ b/vendor/github.com/containous/go-bindata/convert.go @@ -0,0 +1,261 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + "unicode" +) + +// Translate reads assets from an input directory, converts them +// to Go code and writes new files to the output specified +// in the given configuration. +func Translate(c *Config) error { + var toc []Asset + + // Ensure our configuration has sane values. + err := c.validate() + if err != nil { + return err + } + + var knownFuncs = make(map[string]int) + var visitedPaths = make(map[string]bool) + // Locate all the assets. + for _, input := range c.Input { + err = findFiles(input.Path, c.Prefix, input.Recursive, &toc, c.Ignore, knownFuncs, visitedPaths) + if err != nil { + return err + } + } + + // Create output file. + fd, err := os.Create(c.Output) + if err != nil { + return err + } + + defer fd.Close() + + // Create a buffered writer for better performance. + bfd := bufio.NewWriter(fd) + defer bfd.Flush() + + // Write the header. This makes e.g. Github ignore diffs in generated files. + if _, err = fmt.Fprint(bfd, "// Code generated by go-bindata.\n"); err != nil { + return err + } + if _, err = fmt.Fprint(bfd, "// sources:\n"); err != nil { + return err + } + + wd, err := os.Getwd() + if err != nil { + return err + } + + for _, asset := range toc { + relative, _ := filepath.Rel(wd, asset.Path) + if _, err = fmt.Fprintf(bfd, "// %s\n", filepath.ToSlash(relative)); err != nil { + return err + } + } + if _, err = fmt.Fprint(bfd, "// DO NOT EDIT!\n\n"); err != nil { + return err + } + + // Write build tags, if applicable. + if len(c.Tags) > 0 { + if _, err = fmt.Fprintf(bfd, "// +build %s\n\n", c.Tags); err != nil { + return err + } + } + + // Write package declaration. + _, err = fmt.Fprintf(bfd, "package %s\n\n", c.Package) + if err != nil { + return err + } + + // Write assets. + if c.Debug || c.Dev { + err = writeDebug(bfd, c, toc) + } else { + err = writeRelease(bfd, c, toc) + } + + if err != nil { + return err + } + + // Write table of contents + if err := writeTOC(bfd, toc); err != nil { + return err + } + // Write hierarchical tree of assets + if err := writeTOCTree(bfd, toc); err != nil { + return err + } + + // Write restore procedure + return writeRestore(bfd) +} + +// Implement sort.Interface for []os.FileInfo based on Name() +type ByName []os.FileInfo + +func (v ByName) Len() int { return len(v) } +func (v ByName) Swap(i, j int) { v[i], v[j] = v[j], v[i] } +func (v ByName) Less(i, j int) bool { return v[i].Name() < v[j].Name() } + +// findFiles recursively finds all the file paths in the given directory tree. +// They are added to the given map as keys. Values will be safe function names +// for each file, which will be used when generating the output code. +func findFiles(dir, prefix string, recursive bool, toc *[]Asset, ignore []*regexp.Regexp, knownFuncs map[string]int, visitedPaths map[string]bool) error { + dirpath := dir + if len(prefix) > 0 { + dirpath, _ = filepath.Abs(dirpath) + prefix, _ = filepath.Abs(prefix) + prefix = filepath.ToSlash(prefix) + } + + fi, err := os.Stat(dirpath) + if err != nil { + return err + } + + var list []os.FileInfo + + if !fi.IsDir() { + dirpath = filepath.Dir(dirpath) + list = []os.FileInfo{fi} + } else { + visitedPaths[dirpath] = true + fd, err := os.Open(dirpath) + if err != nil { + return err + } + + defer fd.Close() + + list, err = fd.Readdir(0) + if err != nil { + return err + } + + // Sort to make output stable between invocations + sort.Sort(ByName(list)) + } + + for _, file := range list { + var asset Asset + asset.Path = filepath.Join(dirpath, file.Name()) + asset.Name = filepath.ToSlash(asset.Path) + + ignoring := false + for _, re := range ignore { + if re.MatchString(asset.Path) { + ignoring = true + break + } + } + if ignoring { + continue + } + + if file.IsDir() { + if recursive { + recursivePath := filepath.Join(dir, file.Name()) + visitedPaths[asset.Path] = true + findFiles(recursivePath, prefix, recursive, toc, ignore, knownFuncs, visitedPaths) + } + continue + } else if file.Mode()&os.ModeSymlink == os.ModeSymlink { + var linkPath string + if linkPath, err = os.Readlink(asset.Path); err != nil { + return err + } + if !filepath.IsAbs(linkPath) { + if linkPath, err = filepath.Abs(dirpath + "/" + linkPath); err != nil { + return err + } + } + if _, ok := visitedPaths[linkPath]; !ok { + visitedPaths[linkPath] = true + findFiles(asset.Path, prefix, recursive, toc, ignore, knownFuncs, visitedPaths) + } + continue + } + + if strings.HasPrefix(asset.Name, prefix) { + asset.Name = asset.Name[len(prefix):] + } else { + asset.Name = filepath.Join(dir, file.Name()) + } + + // If we have a leading slash, get rid of it. + if len(asset.Name) > 0 && asset.Name[0] == '/' { + asset.Name = asset.Name[1:] + } + + // This shouldn't happen. + if len(asset.Name) == 0 { + return fmt.Errorf("Invalid file: %v", asset.Path) + } + + asset.Func = safeFunctionName(asset.Name, knownFuncs) + asset.Path, _ = filepath.Abs(asset.Path) + *toc = append(*toc, asset) + } + + return nil +} + +var regFuncName = regexp.MustCompile(`[^a-zA-Z0-9_]`) + +// safeFunctionName converts the given name into a name +// which qualifies as a valid function identifier. It +// also compares against a known list of functions to +// prevent conflict based on name translation. +func safeFunctionName(name string, knownFuncs map[string]int) string { + var inBytes, outBytes []byte + var toUpper bool + + name = strings.ToLower(name) + inBytes = []byte(name) + + for i := 0; i < len(inBytes); i++ { + if regFuncName.Match([]byte{inBytes[i]}) { + toUpper = true + } else if toUpper { + outBytes = append(outBytes, []byte(strings.ToUpper(string(inBytes[i])))...) + toUpper = false + } else { + outBytes = append(outBytes, inBytes[i]) + } + } + + name = string(outBytes) + + // Identifier can't start with a digit. + if unicode.IsDigit(rune(name[0])) { + name = "_" + name + } + + if num, ok := knownFuncs[name]; ok { + knownFuncs[name] = num + 1 + name = fmt.Sprintf("%s%d", name, num) + } else { + knownFuncs[name] = 2 + } + + return name +} diff --git a/vendor/github.com/containous/go-bindata/debug.go b/vendor/github.com/containous/go-bindata/debug.go new file mode 100644 index 0000000..09fee78 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/debug.go @@ -0,0 +1,87 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "fmt" + "io" +) + +// writeDebug writes the debug code file. +func writeDebug(w io.Writer, c *Config, toc []Asset) error { + err := writeDebugHeader(w) + if err != nil { + return err + } + + for i := range toc { + err = writeDebugAsset(w, c, &toc[i]) + if err != nil { + return err + } + } + + return nil +} + +// writeDebugHeader writes output file headers. +// This targets debug builds. +func writeDebugHeader(w io.Writer) error { + _, err := fmt.Fprintf(w, `import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +// bindataRead reads the given file from disk. It returns an error on failure. +func bindataRead(path, name string) ([]byte, error) { + buf, err := ioutil.ReadFile(path) + if err != nil { + err = fmt.Errorf("Error reading asset %%s at %%s: %%v", name, path, err) + } + return buf, err +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +`) + return err +} + +// writeDebugAsset write a debug entry for the given asset. +// A debug entry is simply a function which reads the asset from +// the original file (e.g.: from disk). +func writeDebugAsset(w io.Writer, c *Config, asset *Asset) error { + pathExpr := fmt.Sprintf("%q", asset.Path) + if c.Dev { + pathExpr = fmt.Sprintf("filepath.Join(rootDir, %q)", asset.Name) + } + + _, err := fmt.Fprintf(w, `// %s reads file data from disk. It returns an error on failure. +func %s() (*asset, error) { + path := %s + name := %q + bytes, err := bindataRead(path, name) + if err != nil { + return nil, err + } + + fi, err := os.Stat(path) + if err != nil { + err = fmt.Errorf("Error reading asset info %%s at %%s: %%v", name, path, err) + } + + a := &asset{bytes: bytes, info: fi} + return a, err +} + +`, asset.Func, asset.Func, pathExpr, asset.Name) + return err +} diff --git a/vendor/github.com/containous/go-bindata/doc.go b/vendor/github.com/containous/go-bindata/doc.go new file mode 100644 index 0000000..09ead1e --- /dev/null +++ b/vendor/github.com/containous/go-bindata/doc.go @@ -0,0 +1,129 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +/* +bindata converts any file into managable Go source code. Useful for +embedding binary data into a go program. The file data is optionally gzip +compressed before being converted to a raw byte slice. + +The following paragraphs cover some of the customization options +which can be specified in the Config struct, which must be passed into +the Translate() call. + + +Debug vs Release builds + +When used with the `Debug` option, the generated code does not actually include +the asset data. Instead, it generates function stubs which load the data from +the original file on disk. The asset API remains identical between debug and +release builds, so your code will not have to change. + +This is useful during development when you expect the assets to change often. +The host application using these assets uses the same API in both cases and +will not have to care where the actual data comes from. + +An example is a Go webserver with some embedded, static web content like +HTML, JS and CSS files. While developing it, you do not want to rebuild the +whole server and restart it every time you make a change to a bit of +javascript. You just want to build and launch the server once. Then just press +refresh in the browser to see those changes. Embedding the assets with the +`debug` flag allows you to do just that. When you are finished developing and +ready for deployment, just re-invoke `go-bindata` without the `-debug` flag. +It will now embed the latest version of the assets. + + +Lower memory footprint + +The `NoMemCopy` option will alter the way the output file is generated. +It will employ a hack that allows us to read the file data directly from +the compiled program's `.rodata` section. This ensures that when we call +call our generated function, we omit unnecessary memcopies. + +The downside of this, is that it requires dependencies on the `reflect` and +`unsafe` packages. These may be restricted on platforms like AppEngine and +thus prevent you from using this mode. + +Another disadvantage is that the byte slice we create, is strictly read-only. +For most use-cases this is not a problem, but if you ever try to alter the +returned byte slice, a runtime panic is thrown. Use this mode only on target +platforms where memory constraints are an issue. + +The default behaviour is to use the old code generation method. This +prevents the two previously mentioned issues, but will employ at least one +extra memcopy and thus increase memory requirements. + +For instance, consider the following two examples: + +This would be the default mode, using an extra memcopy but gives a safe +implementation without dependencies on `reflect` and `unsafe`: + + func myfile() []byte { + return []byte{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a} + } + +Here is the same functionality, but uses the `.rodata` hack. +The byte slice returned from this example can not be written to without +generating a runtime error. + + var _myfile = "\x89\x50\x4e\x47\x0d\x0a\x1a" + + func myfile() []byte { + var empty [0]byte + sx := (*reflect.StringHeader)(unsafe.Pointer(&_myfile)) + b := empty[:] + bx := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bx.Data = sx.Data + bx.Len = len(_myfile) + bx.Cap = bx.Len + return b + } + + +Optional compression + +The NoCompress option indicates that the supplied assets are *not* GZIP +compressed before being turned into Go code. The data should still be accessed +through a function call, so nothing changes in the API. + +This feature is useful if you do not care for compression, or the supplied +resource is already compressed. Doing it again would not add any value and may +even increase the size of the data. + +The default behaviour of the program is to use compression. + + +Path prefix stripping + +The keys used in the `_bindata` map are the same as the input file name +passed to `go-bindata`. This includes the path. In most cases, this is not +desireable, as it puts potentially sensitive information in your code base. +For this purpose, the tool supplies another command line flag `-prefix`. +This accepts a portion of a path name, which should be stripped off from +the map keys and function names. + +For example, running without the `-prefix` flag, we get: + + $ go-bindata /path/to/templates/ + + _bindata["/path/to/templates/foo.html"] = path_to_templates_foo_html + +Running with the `-prefix` flag, we get: + + $ go-bindata -prefix "/path/to/" /path/to/templates/ + + _bindata["templates/foo.html"] = templates_foo_html + + +Build tags + +With the optional Tags field, you can specify any go build tags that +must be fulfilled for the output file to be included in a build. This +is useful when including binary data in multiple formats, where the desired +format is specified at build time with the appropriate tags. + +The tags are appended to a `// +build` line in the beginning of the output file +and must follow the build tags syntax specified by the go tool. + +*/ +package bindata diff --git a/vendor/github.com/containous/go-bindata/go-bindata/AppendSliceValue.go b/vendor/github.com/containous/go-bindata/go-bindata/AppendSliceValue.go new file mode 100644 index 0000000..f5da495 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/go-bindata/AppendSliceValue.go @@ -0,0 +1,22 @@ +package main + +import "strings" + +// borrowed from https://github.com/hashicorp/serf/blob/master/command/agent/flag_slice_value.go + +// AppendSliceValue implements the flag.Value interface and allows multiple +// calls to the same variable to append a list. +type AppendSliceValue []string + +func (s *AppendSliceValue) String() string { + return strings.Join(*s, ",") +} + +func (s *AppendSliceValue) Set(value string) error { + if *s == nil { + *s = make([]string, 0, 1) + } + + *s = append(*s, value) + return nil +} diff --git a/vendor/github.com/containous/go-bindata/go-bindata/main.go b/vendor/github.com/containous/go-bindata/go-bindata/main.go new file mode 100644 index 0000000..7398270 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/go-bindata/main.go @@ -0,0 +1,107 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/containous/go-bindata" +) + +func main() { + cfg := parseArgs() + err := bindata.Translate(cfg) + + if err != nil { + fmt.Fprintf(os.Stderr, "bindata: %v\n", err) + os.Exit(1) + } +} + +// parseArgs create s a new, filled configuration instance +// by reading and parsing command line options. +// +// This function exits the program with an error, if +// any of the command line options are incorrect. +func parseArgs() *bindata.Config { + var version bool + + c := bindata.NewConfig() + + flag.Usage = func() { + fmt.Printf("Usage: %s [options] \n\n", os.Args[0]) + flag.PrintDefaults() + } + + flag.BoolVar(&c.Debug, "debug", c.Debug, "Do not embed the assets, but provide the embedding API. Contents will still be loaded from disk.") + flag.BoolVar(&c.Dev, "dev", c.Dev, "Similar to debug, but does not emit absolute paths. Expects a rootDir variable to already exist in the generated code's package.") + flag.StringVar(&c.Tags, "tags", c.Tags, "Optional set of build tags to include.") + flag.StringVar(&c.Prefix, "prefix", c.Prefix, "Optional path prefix to strip off asset names.") + flag.StringVar(&c.Package, "pkg", c.Package, "Package name to use in the generated code.") + flag.BoolVar(&c.NoMemCopy, "nomemcopy", c.NoMemCopy, "Use a .rodata hack to get rid of unnecessary memcopies. Refer to the documentation to see what implications this carries.") + flag.BoolVar(&c.NoCompress, "nocompress", c.NoCompress, "Assets will *not* be GZIP compressed when this flag is specified.") + flag.BoolVar(&c.NoMetadata, "nometadata", c.NoMetadata, "Assets will not preserve size, mode, and modtime info.") + flag.UintVar(&c.Mode, "mode", c.Mode, "Optional file mode override for all files.") + flag.Int64Var(&c.ModTime, "modtime", c.ModTime, "Optional modification unix timestamp override for all files.") + flag.StringVar(&c.Output, "o", c.Output, "Optional name of the output file to be generated.") + flag.BoolVar(&version, "version", false, "Displays version information.") + + ignore := make([]string, 0) + flag.Var((*AppendSliceValue)(&ignore), "ignore", "Regex pattern to ignore") + + flag.Parse() + + patterns := make([]*regexp.Regexp, 0) + for _, pattern := range ignore { + patterns = append(patterns, regexp.MustCompile(pattern)) + } + c.Ignore = patterns + + if version { + fmt.Printf("%s\n", Version()) + os.Exit(0) + } + + // Make sure we have input paths. + if flag.NArg() == 0 { + fmt.Fprintf(os.Stderr, "Missing \n\n") + flag.Usage() + os.Exit(1) + } + + // Create input configurations. + c.Input = make([]bindata.InputConfig, flag.NArg()) + for i := range c.Input { + c.Input[i] = parseInput(flag.Arg(i)) + } + + return c +} + +// parseRecursive determines whether the given path has a recrusive indicator and +// returns a new path with the recursive indicator chopped off if it does. +// +// ex: +// /path/to/foo/... -> (/path/to/foo, true) +// /path/to/bar -> (/path/to/bar, false) +func parseInput(path string) bindata.InputConfig { + if strings.HasSuffix(path, "/...") { + return bindata.InputConfig{ + Path: filepath.Clean(path[:len(path)-4]), + Recursive: true, + } + } else { + return bindata.InputConfig{ + Path: filepath.Clean(path), + Recursive: false, + } + } + +} diff --git a/vendor/github.com/containous/go-bindata/go-bindata/version.go b/vendor/github.com/containous/go-bindata/go-bindata/version.go new file mode 100644 index 0000000..01c6703 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/go-bindata/version.go @@ -0,0 +1,19 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +import ( + "fmt" + "runtime" +) + +const AppName = "go-bindata" + +var AppVersion = "dev" + +func Version() string { + return fmt.Sprintf("%s %s (Go runtime %s).\nCopyright (c) 2010-2013, Jim Teeuwen.", + AppName, AppVersion, runtime.Version()) +} diff --git a/vendor/github.com/containous/go-bindata/release.go b/vendor/github.com/containous/go-bindata/release.go new file mode 100644 index 0000000..6aefeb2 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/release.go @@ -0,0 +1,387 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "unicode/utf8" +) + +// writeRelease writes the release code file. +func writeRelease(w io.Writer, c *Config, toc []Asset) error { + err := writeReleaseHeader(w, c) + if err != nil { + return err + } + + for i := range toc { + err = writeReleaseAsset(w, c, &toc[i]) + if err != nil { + return err + } + } + + return nil +} + +// writeReleaseHeader writes output file headers. +// This targets release builds. +func writeReleaseHeader(w io.Writer, c *Config) error { + var err error + if c.NoCompress { + if c.NoMemCopy { + err = header_uncompressed_nomemcopy(w) + } else { + err = header_uncompressed_memcopy(w) + } + } else { + if c.NoMemCopy { + err = header_compressed_nomemcopy(w) + } else { + err = header_compressed_memcopy(w) + } + } + if err != nil { + return err + } + return header_release_common(w) +} + +// writeReleaseAsset write a release entry for the given asset. +// A release entry is a function which embeds and returns +// the file's byte content. +func writeReleaseAsset(w io.Writer, c *Config, asset *Asset) error { + fd, err := os.Open(asset.Path) + if err != nil { + return err + } + + defer fd.Close() + + if c.NoCompress { + if c.NoMemCopy { + err = uncompressed_nomemcopy(w, asset, fd) + } else { + err = uncompressed_memcopy(w, asset, fd) + } + } else { + if c.NoMemCopy { + err = compressed_nomemcopy(w, asset, fd) + } else { + err = compressed_memcopy(w, asset, fd) + } + } + if err != nil { + return err + } + return asset_release_common(w, c, asset) +} + +// sanitize prepares a valid UTF-8 string as a raw string constant. +// Based on https://code.google.com/p/go/source/browse/godoc/static/makestatic.go?repo=tools +func sanitize(b []byte) []byte { + // Replace ` with `+"`"+` + b = bytes.Replace(b, []byte("`"), []byte("`+\"`\"+`"), -1) + + // Replace BOM with `+"\xEF\xBB\xBF"+` + // (A BOM is valid UTF-8 but not permitted in Go source files. + // I wouldn't bother handling this, but for some insane reason + // jquery.js has a BOM somewhere in the middle.) + return bytes.Replace(b, []byte("\xEF\xBB\xBF"), []byte("`+\"\\xEF\\xBB\\xBF\"+`"), -1) +} + +func header_compressed_nomemcopy(w io.Writer) error { + _, err := fmt.Fprintf(w, `import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data, name string) ([]byte, error) { + gz, err := gzip.NewReader(strings.NewReader(data)) + if err != nil { + return nil, fmt.Errorf("Read %%q: %%v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %%q: %%v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +`) + return err +} + +func header_compressed_memcopy(w io.Writer) error { + _, err := fmt.Fprintf(w, `import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %%q: %%v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %%q: %%v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +`) + return err +} + +func header_uncompressed_nomemcopy(w io.Writer) error { + _, err := fmt.Fprintf(w, `import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "strings" + "time" + "unsafe" +) + +func bindataRead(data, name string) ([]byte, error) { + var empty [0]byte + sx := (*reflect.StringHeader)(unsafe.Pointer(&data)) + b := empty[:] + bx := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bx.Data = sx.Data + bx.Len = len(data) + bx.Cap = bx.Len + return b, nil +} + +`) + return err +} + +func header_uncompressed_memcopy(w io.Writer) error { + _, err := fmt.Fprintf(w, `import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) +`) + return err +} + +func header_release_common(w io.Writer) error { + _, err := fmt.Fprintf(w, `type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +`) + return err +} + +func compressed_nomemcopy(w io.Writer, asset *Asset, r io.Reader) error { + _, err := fmt.Fprintf(w, `var _%s = "`, asset.Func) + if err != nil { + return err + } + + gz := gzip.NewWriter(&StringWriter{Writer: w}) + _, err = io.Copy(gz, r) + gz.Close() + + if err != nil { + return err + } + + _, err = fmt.Fprintf(w, `" + +func %sBytes() ([]byte, error) { + return bindataRead( + _%s, + %q, + ) +} + +`, asset.Func, asset.Func, asset.Name) + return err +} + +func compressed_memcopy(w io.Writer, asset *Asset, r io.Reader) error { + _, err := fmt.Fprintf(w, `var _%s = []byte("`, asset.Func) + if err != nil { + return err + } + + gz := gzip.NewWriter(&StringWriter{Writer: w}) + _, err = io.Copy(gz, r) + gz.Close() + + if err != nil { + return err + } + + _, err = fmt.Fprintf(w, `") + +func %sBytes() ([]byte, error) { + return bindataRead( + _%s, + %q, + ) +} + +`, asset.Func, asset.Func, asset.Name) + return err +} + +func uncompressed_nomemcopy(w io.Writer, asset *Asset, r io.Reader) error { + _, err := fmt.Fprintf(w, `var _%s = "`, asset.Func) + if err != nil { + return err + } + + _, err = io.Copy(&StringWriter{Writer: w}, r) + if err != nil { + return err + } + + _, err = fmt.Fprintf(w, `" + +func %sBytes() ([]byte, error) { + return bindataRead( + _%s, + %q, + ) +} + +`, asset.Func, asset.Func, asset.Name) + return err +} + +func uncompressed_memcopy(w io.Writer, asset *Asset, r io.Reader) error { + _, err := fmt.Fprintf(w, `var _%s = []byte(`, asset.Func) + if err != nil { + return err + } + + b, err := ioutil.ReadAll(r) + if err != nil { + return err + } + if utf8.Valid(b) && !bytes.Contains(b, []byte{0}) { + fmt.Fprintf(w, "`%s`", sanitize(b)) + } else { + fmt.Fprintf(w, "%+q", b) + } + + _, err = fmt.Fprintf(w, `) + +func %sBytes() ([]byte, error) { + return _%s, nil +} + +`, asset.Func, asset.Func) + return err +} + +func asset_release_common(w io.Writer, c *Config, asset *Asset) error { + fi, err := os.Stat(asset.Path) + if err != nil { + return err + } + + mode := uint(fi.Mode()) + modTime := fi.ModTime().Unix() + size := fi.Size() + if c.NoMetadata { + mode = 0 + modTime = 0 + size = 0 + } + if c.Mode > 0 { + mode = uint(os.ModePerm) & c.Mode + } + if c.ModTime > 0 { + modTime = c.ModTime + } + _, err = fmt.Fprintf(w, `func %s() (*asset, error) { + bytes, err := %sBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: %q, size: %d, mode: os.FileMode(%d), modTime: time.Unix(%d, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +`, asset.Func, asset.Func, asset.Name, size, mode, modTime) + return err +} diff --git a/vendor/github.com/containous/go-bindata/restore.go b/vendor/github.com/containous/go-bindata/restore.go new file mode 100644 index 0000000..65db0e8 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/restore.go @@ -0,0 +1,63 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "fmt" + "io" +) + +func writeRestore(w io.Writer) error { + _, err := fmt.Fprintf(w, ` +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} + +`) + return err +} diff --git a/vendor/github.com/containous/go-bindata/stringwriter.go b/vendor/github.com/containous/go-bindata/stringwriter.go new file mode 100644 index 0000000..77daa04 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/stringwriter.go @@ -0,0 +1,36 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "io" +) + +const lowerHex = "0123456789abcdef" + +type StringWriter struct { + io.Writer + c int +} + +func (w *StringWriter) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return + } + + buf := []byte(`\x00`) + var b byte + + for n, b = range p { + buf[2] = lowerHex[b/16] + buf[3] = lowerHex[b%16] + w.Writer.Write(buf) + w.c++ + } + + n++ + + return +} diff --git a/vendor/github.com/containous/go-bindata/toc.go b/vendor/github.com/containous/go-bindata/toc.go new file mode 100644 index 0000000..cd01652 --- /dev/null +++ b/vendor/github.com/containous/go-bindata/toc.go @@ -0,0 +1,230 @@ +// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +// license. Its contents can be found at: +// http://creativecommons.org/publicdomain/zero/1.0/ + +package bindata + +import ( + "fmt" + "io" + "sort" + "strings" +) + +type assetTree struct { + Asset Asset + Children map[string]*assetTree +} + +func newAssetTree() *assetTree { + tree := &assetTree{} + tree.Children = make(map[string]*assetTree) + return tree +} + +func (node *assetTree) child(name string) *assetTree { + rv, ok := node.Children[name] + if !ok { + rv = newAssetTree() + node.Children[name] = rv + } + return rv +} + +func (root *assetTree) Add(route []string, asset Asset) { + for _, name := range route { + root = root.child(name) + } + root.Asset = asset +} + +func ident(w io.Writer, n int) { + for i := 0; i < n; i++ { + w.Write([]byte{'\t'}) + } +} + +func (root *assetTree) funcOrNil() string { + if root.Asset.Func == "" { + return "nil" + } else { + return root.Asset.Func + } +} + +func (root *assetTree) writeGoMap(w io.Writer, nident int) { + fmt.Fprintf(w, "&bintree{%s, map[string]*bintree{", root.funcOrNil()) + + if len(root.Children) > 0 { + io.WriteString(w, "\n") + + // Sort to make output stable between invocations + filenames := make([]string, len(root.Children)) + i := 0 + for filename := range root.Children { + filenames[i] = filename + i++ + } + sort.Strings(filenames) + + for _, p := range filenames { + ident(w, nident+1) + fmt.Fprintf(w, `"%s": `, p) + root.Children[p].writeGoMap(w, nident+1) + } + ident(w, nident) + } + + io.WriteString(w, "}}") + if nident > 0 { + io.WriteString(w, ",") + } + io.WriteString(w, "\n") +} + +func (root *assetTree) WriteAsGoMap(w io.Writer) error { + _, err := fmt.Fprint(w, `type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} +var _bintree = `) + root.writeGoMap(w, 0) + return err +} + +func writeTOCTree(w io.Writer, toc []Asset) error { + _, err := fmt.Fprintf(w, `// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %%s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %%s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +`) + if err != nil { + return err + } + tree := newAssetTree() + for i := range toc { + pathList := strings.Split(toc[i].Name, "/") + tree.Add(pathList, toc[i]) + } + return tree.WriteAsGoMap(w) +} + +// writeTOC writes the table of contents file. +func writeTOC(w io.Writer, toc []Asset) error { + err := writeTOCHeader(w) + if err != nil { + return err + } + + for i := range toc { + err = writeTOCAsset(w, &toc[i]) + if err != nil { + return err + } + } + + return writeTOCFooter(w) +} + +// writeTOCHeader writes the table of contents file header. +func writeTOCHeader(w io.Writer) error { + _, err := fmt.Fprintf(w, `// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %%s can't read by error: %%v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %%s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %%s can't read by error: %%v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %%s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ +`) + return err +} + +// writeTOCAsset write a TOC entry for the given asset. +func writeTOCAsset(w io.Writer, asset *Asset) error { + _, err := fmt.Fprintf(w, "\t%q: %s,\n", asset.Name, asset.Func) + return err +} + +// writeTOCFooter writes the table of contents file footer. +func writeTOCFooter(w io.Writer) error { + _, err := fmt.Fprintf(w, `} + +`) + return err +} diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905..0000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905..0000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE deleted file mode 100644 index 5b6e7c6..0000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/docs/static_files/contributors.png b/vendor/github.com/docker/docker/docs/static_files/contributors.png deleted file mode 100644 index 63c0a0c..0000000 Binary files a/vendor/github.com/docker/docker/docs/static_files/contributors.png and /dev/null differ diff --git a/vendor/github.com/docker/docker/hack/generate-authors.sh b/vendor/github.com/docker/docker/hack/generate-authors.sh deleted file mode 100755 index e78a97f..0000000 --- a/vendor/github.com/docker/docker/hack/generate-authors.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")/.." - -# see also ".mailmap" for how email addresses and names are deduplicated - -{ - cat <<-'EOH' - # This file lists all individuals having contributed content to the repository. - # For how it is generated, see `hack/generate-authors.sh`. - EOH - echo - git log --format='%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf -} > AUTHORS diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default deleted file mode 120000 index 4278533..0000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker.default \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init deleted file mode 120000 index 8cb89d3..0000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart deleted file mode 120000 index 7e1b64a..0000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/upstart/docker.conf \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev deleted file mode 120000 index 914a361..0000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/udev/80-docker.rules \ No newline at end of file diff --git a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE deleted file mode 100644 index 34c4ea7..0000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2014-2016 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD deleted file mode 100644 index 9b4f4a2..0000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014-2016 The Docker & Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md b/vendor/github.com/docker/docker/project/CONTRIBUTORS.md deleted file mode 120000 index 44fcc63..0000000 --- a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md +++ /dev/null @@ -1 +0,0 @@ -../CONTRIBUTING.md \ No newline at end of file diff --git a/vendor/github.com/dustin/go-humanize/.travis.yml b/vendor/github.com/dustin/go-humanize/.travis.yml new file mode 100644 index 0000000..ba95cdd --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/.travis.yml @@ -0,0 +1,21 @@ +sudo: false +language: go +go: + - 1.3.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - master +matrix: + allow_failures: + - go: master + fast_finish: true +install: + - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). +script: + - go get -t -v ./... + - diff -u <(echo -n) <(gofmt -d -s .) + - go tool vet . + - go test -v -race ./... diff --git a/vendor/github.com/dustin/go-humanize/LICENSE b/vendor/github.com/dustin/go-humanize/LICENSE new file mode 100644 index 0000000..8d9a94a --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2005-2008 Dustin Sallings + +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/dustin/go-humanize/README.markdown b/vendor/github.com/dustin/go-humanize/README.markdown new file mode 100644 index 0000000..91b4ae5 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/README.markdown @@ -0,0 +1,124 @@ +# Humane Units [![Build Status](https://travis-ci.org/dustin/go-humanize.svg?branch=master)](https://travis-ci.org/dustin/go-humanize) [![GoDoc](https://godoc.org/github.com/dustin/go-humanize?status.svg)](https://godoc.org/github.com/dustin/go-humanize) + +Just a few functions for helping humanize times and sizes. + +`go get` it as `github.com/dustin/go-humanize`, import it as +`"github.com/dustin/go-humanize"`, use it as `humanize`. + +See [godoc](https://godoc.org/github.com/dustin/go-humanize) for +complete documentation. + +## Sizes + +This lets you take numbers like `82854982` and convert them to useful +strings like, `83 MB` or `79 MiB` (whichever you prefer). + +Example: + +```go +fmt.Printf("That file is %s.", humanize.Bytes(82854982)) // That file is 83 MB. +``` + +## Times + +This lets you take a `time.Time` and spit it out in relative terms. +For example, `12 seconds ago` or `3 days from now`. + +Example: + +```go +fmt.Printf("This was touched %s.", humanize.Time(someTimeInstance)) // This was touched 7 hours ago. +``` + +Thanks to Kyle Lemons for the time implementation from an IRC +conversation one day. It's pretty neat. + +## Ordinals + +From a [mailing list discussion][odisc] where a user wanted to be able +to label ordinals. + + 0 -> 0th + 1 -> 1st + 2 -> 2nd + 3 -> 3rd + 4 -> 4th + [...] + +Example: + +```go +fmt.Printf("You're my %s best friend.", humanize.Ordinal(193)) // You are my 193rd best friend. +``` + +## Commas + +Want to shove commas into numbers? Be my guest. + + 0 -> 0 + 100 -> 100 + 1000 -> 1,000 + 1000000000 -> 1,000,000,000 + -100000 -> -100,000 + +Example: + +```go +fmt.Printf("You owe $%s.\n", humanize.Comma(6582491)) // You owe $6,582,491. +``` + +## Ftoa + +Nicer float64 formatter that removes trailing zeros. + +```go +fmt.Printf("%f", 2.24) // 2.240000 +fmt.Printf("%s", humanize.Ftoa(2.24)) // 2.24 +fmt.Printf("%f", 2.0) // 2.000000 +fmt.Printf("%s", humanize.Ftoa(2.0)) // 2 +``` + +## SI notation + +Format numbers with [SI notation][sinotation]. + +Example: + +```go +humanize.SI(0.00000000223, "M") // 2.23 nM +``` + +## English-specific functions + +The following functions are in the `humanize/english` subpackage. + +### Plurals + +Simple English pluralization + +```go +english.PluralWord(1, "object", "") // object +english.PluralWord(42, "object", "") // objects +english.PluralWord(2, "bus", "") // buses +english.PluralWord(99, "locus", "loci") // loci + +english.Plural(1, "object", "") // 1 object +english.Plural(42, "object", "") // 42 objects +english.Plural(2, "bus", "") // 2 buses +english.Plural(99, "locus", "loci") // 99 loci +``` + +### Word series + +Format comma-separated words lists with conjuctions: + +```go +english.WordSeries([]string{"foo"}, "and") // foo +english.WordSeries([]string{"foo", "bar"}, "and") // foo and bar +english.WordSeries([]string{"foo", "bar", "baz"}, "and") // foo, bar and baz + +english.OxfordWordSeries([]string{"foo", "bar", "baz"}, "and") // foo, bar, and baz +``` + +[odisc]: https://groups.google.com/d/topic/golang-nuts/l8NhI74jl-4/discussion +[sinotation]: http://en.wikipedia.org/wiki/Metric_prefix diff --git a/vendor/github.com/dustin/go-humanize/big.go b/vendor/github.com/dustin/go-humanize/big.go new file mode 100644 index 0000000..f49dc33 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/big.go @@ -0,0 +1,31 @@ +package humanize + +import ( + "math/big" +) + +// order of magnitude (to a max order) +func oomm(n, b *big.Int, maxmag int) (float64, int) { + mag := 0 + m := &big.Int{} + for n.Cmp(b) >= 0 { + n.DivMod(n, b, m) + mag++ + if mag == maxmag && maxmag >= 0 { + break + } + } + return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag +} + +// total order of magnitude +// (same as above, but with no upper limit) +func oom(n, b *big.Int) (float64, int) { + mag := 0 + m := &big.Int{} + for n.Cmp(b) >= 0 { + n.DivMod(n, b, m) + mag++ + } + return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag +} diff --git a/vendor/github.com/dustin/go-humanize/bigbytes.go b/vendor/github.com/dustin/go-humanize/bigbytes.go new file mode 100644 index 0000000..1a2bf61 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/bigbytes.go @@ -0,0 +1,173 @@ +package humanize + +import ( + "fmt" + "math/big" + "strings" + "unicode" +) + +var ( + bigIECExp = big.NewInt(1024) + + // BigByte is one byte in bit.Ints + BigByte = big.NewInt(1) + // BigKiByte is 1,024 bytes in bit.Ints + BigKiByte = (&big.Int{}).Mul(BigByte, bigIECExp) + // BigMiByte is 1,024 k bytes in bit.Ints + BigMiByte = (&big.Int{}).Mul(BigKiByte, bigIECExp) + // BigGiByte is 1,024 m bytes in bit.Ints + BigGiByte = (&big.Int{}).Mul(BigMiByte, bigIECExp) + // BigTiByte is 1,024 g bytes in bit.Ints + BigTiByte = (&big.Int{}).Mul(BigGiByte, bigIECExp) + // BigPiByte is 1,024 t bytes in bit.Ints + BigPiByte = (&big.Int{}).Mul(BigTiByte, bigIECExp) + // BigEiByte is 1,024 p bytes in bit.Ints + BigEiByte = (&big.Int{}).Mul(BigPiByte, bigIECExp) + // BigZiByte is 1,024 e bytes in bit.Ints + BigZiByte = (&big.Int{}).Mul(BigEiByte, bigIECExp) + // BigYiByte is 1,024 z bytes in bit.Ints + BigYiByte = (&big.Int{}).Mul(BigZiByte, bigIECExp) +) + +var ( + bigSIExp = big.NewInt(1000) + + // BigSIByte is one SI byte in big.Ints + BigSIByte = big.NewInt(1) + // BigKByte is 1,000 SI bytes in big.Ints + BigKByte = (&big.Int{}).Mul(BigSIByte, bigSIExp) + // BigMByte is 1,000 SI k bytes in big.Ints + BigMByte = (&big.Int{}).Mul(BigKByte, bigSIExp) + // BigGByte is 1,000 SI m bytes in big.Ints + BigGByte = (&big.Int{}).Mul(BigMByte, bigSIExp) + // BigTByte is 1,000 SI g bytes in big.Ints + BigTByte = (&big.Int{}).Mul(BigGByte, bigSIExp) + // BigPByte is 1,000 SI t bytes in big.Ints + BigPByte = (&big.Int{}).Mul(BigTByte, bigSIExp) + // BigEByte is 1,000 SI p bytes in big.Ints + BigEByte = (&big.Int{}).Mul(BigPByte, bigSIExp) + // BigZByte is 1,000 SI e bytes in big.Ints + BigZByte = (&big.Int{}).Mul(BigEByte, bigSIExp) + // BigYByte is 1,000 SI z bytes in big.Ints + BigYByte = (&big.Int{}).Mul(BigZByte, bigSIExp) +) + +var bigBytesSizeTable = map[string]*big.Int{ + "b": BigByte, + "kib": BigKiByte, + "kb": BigKByte, + "mib": BigMiByte, + "mb": BigMByte, + "gib": BigGiByte, + "gb": BigGByte, + "tib": BigTiByte, + "tb": BigTByte, + "pib": BigPiByte, + "pb": BigPByte, + "eib": BigEiByte, + "eb": BigEByte, + "zib": BigZiByte, + "zb": BigZByte, + "yib": BigYiByte, + "yb": BigYByte, + // Without suffix + "": BigByte, + "ki": BigKiByte, + "k": BigKByte, + "mi": BigMiByte, + "m": BigMByte, + "gi": BigGiByte, + "g": BigGByte, + "ti": BigTiByte, + "t": BigTByte, + "pi": BigPiByte, + "p": BigPByte, + "ei": BigEiByte, + "e": BigEByte, + "z": BigZByte, + "zi": BigZiByte, + "y": BigYByte, + "yi": BigYiByte, +} + +var ten = big.NewInt(10) + +func humanateBigBytes(s, base *big.Int, sizes []string) string { + if s.Cmp(ten) < 0 { + return fmt.Sprintf("%d B", s) + } + c := (&big.Int{}).Set(s) + val, mag := oomm(c, base, len(sizes)-1) + suffix := sizes[mag] + f := "%.0f %s" + if val < 10 { + f = "%.1f %s" + } + + return fmt.Sprintf(f, val, suffix) + +} + +// BigBytes produces a human readable representation of an SI size. +// +// See also: ParseBigBytes. +// +// BigBytes(82854982) -> 83 MB +func BigBytes(s *big.Int) string { + sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} + return humanateBigBytes(s, bigSIExp, sizes) +} + +// BigIBytes produces a human readable representation of an IEC size. +// +// See also: ParseBigBytes. +// +// BigIBytes(82854982) -> 79 MiB +func BigIBytes(s *big.Int) string { + sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"} + return humanateBigBytes(s, bigIECExp, sizes) +} + +// ParseBigBytes parses a string representation of bytes into the number +// of bytes it represents. +// +// See also: BigBytes, BigIBytes. +// +// ParseBigBytes("42 MB") -> 42000000, nil +// ParseBigBytes("42 mib") -> 44040192, nil +func ParseBigBytes(s string) (*big.Int, error) { + lastDigit := 0 + hasComma := false + for _, r := range s { + if !(unicode.IsDigit(r) || r == '.' || r == ',') { + break + } + if r == ',' { + hasComma = true + } + lastDigit++ + } + + num := s[:lastDigit] + if hasComma { + num = strings.Replace(num, ",", "", -1) + } + + val := &big.Rat{} + _, err := fmt.Sscanf(num, "%f", val) + if err != nil { + return nil, err + } + + extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) + if m, ok := bigBytesSizeTable[extra]; ok { + mv := (&big.Rat{}).SetInt(m) + val.Mul(val, mv) + rv := &big.Int{} + rv.Div(val.Num(), val.Denom()) + return rv, nil + } + + return nil, fmt.Errorf("unhandled size name: %v", extra) +} diff --git a/vendor/github.com/dustin/go-humanize/bytes.go b/vendor/github.com/dustin/go-humanize/bytes.go new file mode 100644 index 0000000..0b498f4 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/bytes.go @@ -0,0 +1,143 @@ +package humanize + +import ( + "fmt" + "math" + "strconv" + "strings" + "unicode" +) + +// IEC Sizes. +// kibis of bits +const ( + Byte = 1 << (iota * 10) + KiByte + MiByte + GiByte + TiByte + PiByte + EiByte +) + +// SI Sizes. +const ( + IByte = 1 + KByte = IByte * 1000 + MByte = KByte * 1000 + GByte = MByte * 1000 + TByte = GByte * 1000 + PByte = TByte * 1000 + EByte = PByte * 1000 +) + +var bytesSizeTable = map[string]uint64{ + "b": Byte, + "kib": KiByte, + "kb": KByte, + "mib": MiByte, + "mb": MByte, + "gib": GiByte, + "gb": GByte, + "tib": TiByte, + "tb": TByte, + "pib": PiByte, + "pb": PByte, + "eib": EiByte, + "eb": EByte, + // Without suffix + "": Byte, + "ki": KiByte, + "k": KByte, + "mi": MiByte, + "m": MByte, + "gi": GiByte, + "g": GByte, + "ti": TiByte, + "t": TByte, + "pi": PiByte, + "p": PByte, + "ei": EiByte, + "e": EByte, +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} + +func humanateBytes(s uint64, base float64, sizes []string) string { + if s < 10 { + return fmt.Sprintf("%d B", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := math.Floor(float64(s)/math.Pow(base, e)*10+0.5) / 10 + f := "%.0f %s" + if val < 10 { + f = "%.1f %s" + } + + return fmt.Sprintf(f, val, suffix) +} + +// Bytes produces a human readable representation of an SI size. +// +// See also: ParseBytes. +// +// Bytes(82854982) -> 83 MB +func Bytes(s uint64) string { + sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"} + return humanateBytes(s, 1000, sizes) +} + +// IBytes produces a human readable representation of an IEC size. +// +// See also: ParseBytes. +// +// IBytes(82854982) -> 79 MiB +func IBytes(s uint64) string { + sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"} + return humanateBytes(s, 1024, sizes) +} + +// ParseBytes parses a string representation of bytes into the number +// of bytes it represents. +// +// See Also: Bytes, IBytes. +// +// ParseBytes("42 MB") -> 42000000, nil +// ParseBytes("42 mib") -> 44040192, nil +func ParseBytes(s string) (uint64, error) { + lastDigit := 0 + hasComma := false + for _, r := range s { + if !(unicode.IsDigit(r) || r == '.' || r == ',') { + break + } + if r == ',' { + hasComma = true + } + lastDigit++ + } + + num := s[:lastDigit] + if hasComma { + num = strings.Replace(num, ",", "", -1) + } + + f, err := strconv.ParseFloat(num, 64) + if err != nil { + return 0, err + } + + extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) + if m, ok := bytesSizeTable[extra]; ok { + f *= float64(m) + if f >= math.MaxUint64 { + return 0, fmt.Errorf("too large: %v", s) + } + return uint64(f), nil + } + + return 0, fmt.Errorf("unhandled size name: %v", extra) +} diff --git a/vendor/github.com/dustin/go-humanize/comma.go b/vendor/github.com/dustin/go-humanize/comma.go new file mode 100644 index 0000000..520ae3e --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/comma.go @@ -0,0 +1,116 @@ +package humanize + +import ( + "bytes" + "math" + "math/big" + "strconv" + "strings" +) + +// Comma produces a string form of the given number in base 10 with +// commas after every three orders of magnitude. +// +// e.g. Comma(834142) -> 834,142 +func Comma(v int64) string { + sign := "" + + // Min int64 can't be negated to a usable value, so it has to be special cased. + if v == math.MinInt64 { + return "-9,223,372,036,854,775,808" + } + + if v < 0 { + sign = "-" + v = 0 - v + } + + parts := []string{"", "", "", "", "", "", ""} + j := len(parts) - 1 + + for v > 999 { + parts[j] = strconv.FormatInt(v%1000, 10) + switch len(parts[j]) { + case 2: + parts[j] = "0" + parts[j] + case 1: + parts[j] = "00" + parts[j] + } + v = v / 1000 + j-- + } + parts[j] = strconv.Itoa(int(v)) + return sign + strings.Join(parts[j:], ",") +} + +// Commaf produces a string form of the given number in base 10 with +// commas after every three orders of magnitude. +// +// e.g. Commaf(834142.32) -> 834,142.32 +func Commaf(v float64) string { + buf := &bytes.Buffer{} + if v < 0 { + buf.Write([]byte{'-'}) + v = 0 - v + } + + comma := []byte{','} + + parts := strings.Split(strconv.FormatFloat(v, 'f', -1, 64), ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buf.WriteString(parts[0][:pos]) + buf.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buf.WriteString(parts[0][pos : pos+3]) + buf.Write(comma) + } + buf.Truncate(buf.Len() - 1) + + if len(parts) > 1 { + buf.Write([]byte{'.'}) + buf.WriteString(parts[1]) + } + return buf.String() +} + +// CommafWithDigits works like the Commaf but limits the resulting +// string to the given number of decimal places. +// +// e.g. CommafWithDigits(834142.32, 1) -> 834,142.3 +func CommafWithDigits(f float64, decimals int) string { + return stripTrailingDigits(Commaf(f), decimals) +} + +// BigComma produces a string form of the given big.Int in base 10 +// with commas after every three orders of magnitude. +func BigComma(b *big.Int) string { + sign := "" + if b.Sign() < 0 { + sign = "-" + b.Abs(b) + } + + athousand := big.NewInt(1000) + c := (&big.Int{}).Set(b) + _, m := oom(c, athousand) + parts := make([]string, m+1) + j := len(parts) - 1 + + mod := &big.Int{} + for b.Cmp(athousand) >= 0 { + b.DivMod(b, athousand, mod) + parts[j] = strconv.FormatInt(mod.Int64(), 10) + switch len(parts[j]) { + case 2: + parts[j] = "0" + parts[j] + case 1: + parts[j] = "00" + parts[j] + } + j-- + } + parts[j] = strconv.Itoa(int(b.Int64())) + return sign + strings.Join(parts[j:], ",") +} diff --git a/vendor/github.com/dustin/go-humanize/commaf.go b/vendor/github.com/dustin/go-humanize/commaf.go new file mode 100644 index 0000000..620690d --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/commaf.go @@ -0,0 +1,40 @@ +// +build go1.6 + +package humanize + +import ( + "bytes" + "math/big" + "strings" +) + +// BigCommaf produces a string form of the given big.Float in base 10 +// with commas after every three orders of magnitude. +func BigCommaf(v *big.Float) string { + buf := &bytes.Buffer{} + if v.Sign() < 0 { + buf.Write([]byte{'-'}) + v.Abs(v) + } + + comma := []byte{','} + + parts := strings.Split(v.Text('f', -1), ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buf.WriteString(parts[0][:pos]) + buf.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buf.WriteString(parts[0][pos : pos+3]) + buf.Write(comma) + } + buf.Truncate(buf.Len() - 1) + + if len(parts) > 1 { + buf.Write([]byte{'.'}) + buf.WriteString(parts[1]) + } + return buf.String() +} diff --git a/vendor/github.com/dustin/go-humanize/ftoa.go b/vendor/github.com/dustin/go-humanize/ftoa.go new file mode 100644 index 0000000..1c62b64 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/ftoa.go @@ -0,0 +1,46 @@ +package humanize + +import ( + "strconv" + "strings" +) + +func stripTrailingZeros(s string) string { + offset := len(s) - 1 + for offset > 0 { + if s[offset] == '.' { + offset-- + break + } + if s[offset] != '0' { + break + } + offset-- + } + return s[:offset+1] +} + +func stripTrailingDigits(s string, digits int) string { + if i := strings.Index(s, "."); i >= 0 { + if digits <= 0 { + return s[:i] + } + i++ + if i+digits >= len(s) { + return s + } + return s[:i+digits] + } + return s +} + +// Ftoa converts a float to a string with no trailing zeros. +func Ftoa(num float64) string { + return stripTrailingZeros(strconv.FormatFloat(num, 'f', 6, 64)) +} + +// FtoaWithDigits converts a float to a string but limits the resulting string +// to the given number of decimal places, and no trailing zeros. +func FtoaWithDigits(num float64, digits int) string { + return stripTrailingZeros(stripTrailingDigits(strconv.FormatFloat(num, 'f', 6, 64), digits)) +} diff --git a/vendor/github.com/dustin/go-humanize/humanize.go b/vendor/github.com/dustin/go-humanize/humanize.go new file mode 100644 index 0000000..a2c2da3 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/humanize.go @@ -0,0 +1,8 @@ +/* +Package humanize converts boring ugly numbers to human-friendly strings and back. + +Durations can be turned into strings such as "3 days ago", numbers +representing sizes like 82854982 into useful strings like, "83 MB" or +"79 MiB" (whichever you prefer). +*/ +package humanize diff --git a/vendor/github.com/dustin/go-humanize/number.go b/vendor/github.com/dustin/go-humanize/number.go new file mode 100644 index 0000000..dec6186 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/number.go @@ -0,0 +1,192 @@ +package humanize + +/* +Slightly adapted from the source to fit go-humanize. + +Author: https://github.com/gorhill +Source: https://gist.github.com/gorhill/5285193 + +*/ + +import ( + "math" + "strconv" +) + +var ( + renderFloatPrecisionMultipliers = [...]float64{ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + } + + renderFloatPrecisionRounders = [...]float64{ + 0.5, + 0.05, + 0.005, + 0.0005, + 0.00005, + 0.000005, + 0.0000005, + 0.00000005, + 0.000000005, + 0.0000000005, + } +) + +// FormatFloat produces a formatted number as string based on the following user-specified criteria: +// * thousands separator +// * decimal separator +// * decimal precision +// +// Usage: s := RenderFloat(format, n) +// The format parameter tells how to render the number n. +// +// See examples: http://play.golang.org/p/LXc1Ddm1lJ +// +// Examples of format strings, given n = 12345.6789: +// "#,###.##" => "12,345.67" +// "#,###." => "12,345" +// "#,###" => "12345,678" +// "#\u202F###,##" => "12 345,68" +// "#.###,###### => 12.345,678900 +// "" (aka default format) => 12,345.67 +// +// The highest precision allowed is 9 digits after the decimal symbol. +// There is also a version for integer number, FormatInteger(), +// which is convenient for calls within template. +func FormatFloat(format string, n float64) string { + // Special cases: + // NaN = "NaN" + // +Inf = "+Infinity" + // -Inf = "-Infinity" + if math.IsNaN(n) { + return "NaN" + } + if n > math.MaxFloat64 { + return "Infinity" + } + if n < -math.MaxFloat64 { + return "-Infinity" + } + + // default format + precision := 2 + decimalStr := "." + thousandStr := "," + positiveStr := "" + negativeStr := "-" + + if len(format) > 0 { + format := []rune(format) + + // If there is an explicit format directive, + // then default values are these: + precision = 9 + thousandStr = "" + + // collect indices of meaningful formatting directives + formatIndx := []int{} + for i, char := range format { + if char != '#' && char != '0' { + formatIndx = append(formatIndx, i) + } + } + + if len(formatIndx) > 0 { + // Directive at index 0: + // Must be a '+' + // Raise an error if not the case + // index: 0123456789 + // +0.000,000 + // +000,000.0 + // +0000.00 + // +0000 + if formatIndx[0] == 0 { + if format[formatIndx[0]] != '+' { + panic("RenderFloat(): invalid positive sign directive") + } + positiveStr = "+" + formatIndx = formatIndx[1:] + } + + // Two directives: + // First is thousands separator + // Raise an error if not followed by 3-digit + // 0123456789 + // 0.000,000 + // 000,000.00 + if len(formatIndx) == 2 { + if (formatIndx[1] - formatIndx[0]) != 4 { + panic("RenderFloat(): thousands separator directive must be followed by 3 digit-specifiers") + } + thousandStr = string(format[formatIndx[0]]) + formatIndx = formatIndx[1:] + } + + // One directive: + // Directive is decimal separator + // The number of digit-specifier following the separator indicates wanted precision + // 0123456789 + // 0.00 + // 000,0000 + if len(formatIndx) == 1 { + decimalStr = string(format[formatIndx[0]]) + precision = len(format) - formatIndx[0] - 1 + } + } + } + + // generate sign part + var signStr string + if n >= 0.000000001 { + signStr = positiveStr + } else if n <= -0.000000001 { + signStr = negativeStr + n = -n + } else { + signStr = "" + n = 0.0 + } + + // split number into integer and fractional parts + intf, fracf := math.Modf(n + renderFloatPrecisionRounders[precision]) + + // generate integer part string + intStr := strconv.FormatInt(int64(intf), 10) + + // add thousand separator if required + if len(thousandStr) > 0 { + for i := len(intStr); i > 3; { + i -= 3 + intStr = intStr[:i] + thousandStr + intStr[i:] + } + } + + // no fractional part, we can leave now + if precision == 0 { + return signStr + intStr + } + + // generate fractional part + fracStr := strconv.Itoa(int(fracf * renderFloatPrecisionMultipliers[precision])) + // may need padding + if len(fracStr) < precision { + fracStr = "000000000000000"[:precision-len(fracStr)] + fracStr + } + + return signStr + intStr + decimalStr + fracStr +} + +// FormatInteger produces a formatted number as string. +// See FormatFloat. +func FormatInteger(format string, n int) string { + return FormatFloat(format, float64(n)) +} diff --git a/vendor/github.com/dustin/go-humanize/ordinals.go b/vendor/github.com/dustin/go-humanize/ordinals.go new file mode 100644 index 0000000..43d88a8 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/ordinals.go @@ -0,0 +1,25 @@ +package humanize + +import "strconv" + +// Ordinal gives you the input number in a rank/ordinal format. +// +// Ordinal(3) -> 3rd +func Ordinal(x int) string { + suffix := "th" + switch x % 10 { + case 1: + if x%100 != 11 { + suffix = "st" + } + case 2: + if x%100 != 12 { + suffix = "nd" + } + case 3: + if x%100 != 13 { + suffix = "rd" + } + } + return strconv.Itoa(x) + suffix +} diff --git a/vendor/github.com/dustin/go-humanize/si.go b/vendor/github.com/dustin/go-humanize/si.go new file mode 100644 index 0000000..ae659e0 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/si.go @@ -0,0 +1,123 @@ +package humanize + +import ( + "errors" + "math" + "regexp" + "strconv" +) + +var siPrefixTable = map[float64]string{ + -24: "y", // yocto + -21: "z", // zepto + -18: "a", // atto + -15: "f", // femto + -12: "p", // pico + -9: "n", // nano + -6: "µ", // micro + -3: "m", // milli + 0: "", + 3: "k", // kilo + 6: "M", // mega + 9: "G", // giga + 12: "T", // tera + 15: "P", // peta + 18: "E", // exa + 21: "Z", // zetta + 24: "Y", // yotta +} + +var revSIPrefixTable = revfmap(siPrefixTable) + +// revfmap reverses the map and precomputes the power multiplier +func revfmap(in map[float64]string) map[string]float64 { + rv := map[string]float64{} + for k, v := range in { + rv[v] = math.Pow(10, k) + } + return rv +} + +var riParseRegex *regexp.Regexp + +func init() { + ri := `^([\-0-9.]+)\s?([` + for _, v := range siPrefixTable { + ri += v + } + ri += `]?)(.*)` + + riParseRegex = regexp.MustCompile(ri) +} + +// ComputeSI finds the most appropriate SI prefix for the given number +// and returns the prefix along with the value adjusted to be within +// that prefix. +// +// See also: SI, ParseSI. +// +// e.g. ComputeSI(2.2345e-12) -> (2.2345, "p") +func ComputeSI(input float64) (float64, string) { + if input == 0 { + return 0, "" + } + mag := math.Abs(input) + exponent := math.Floor(logn(mag, 10)) + exponent = math.Floor(exponent/3) * 3 + + value := mag / math.Pow(10, exponent) + + // Handle special case where value is exactly 1000.0 + // Should return 1 M instead of 1000 k + if value == 1000.0 { + exponent += 3 + value = mag / math.Pow(10, exponent) + } + + value = math.Copysign(value, input) + + prefix := siPrefixTable[exponent] + return value, prefix +} + +// SI returns a string with default formatting. +// +// SI uses Ftoa to format float value, removing trailing zeros. +// +// See also: ComputeSI, ParseSI. +// +// e.g. SI(1000000, "B") -> 1 MB +// e.g. SI(2.2345e-12, "F") -> 2.2345 pF +func SI(input float64, unit string) string { + value, prefix := ComputeSI(input) + return Ftoa(value) + " " + prefix + unit +} + +// SIWithDigits works like SI but limits the resulting string to the +// given number of decimal places. +// +// e.g. SIWithDigits(1000000, 0, "B") -> 1 MB +// e.g. SIWithDigits(2.2345e-12, 2, "F") -> 2.23 pF +func SIWithDigits(input float64, decimals int, unit string) string { + value, prefix := ComputeSI(input) + return FtoaWithDigits(value, decimals) + " " + prefix + unit +} + +var errInvalid = errors.New("invalid input") + +// ParseSI parses an SI string back into the number and unit. +// +// See also: SI, ComputeSI. +// +// e.g. ParseSI("2.2345 pF") -> (2.2345e-12, "F", nil) +func ParseSI(input string) (float64, string, error) { + found := riParseRegex.FindStringSubmatch(input) + if len(found) != 4 { + return 0, "", errInvalid + } + mag := revSIPrefixTable[found[2]] + unit := found[3] + + base, err := strconv.ParseFloat(found[1], 64) + return base * mag, unit, err +} diff --git a/vendor/github.com/dustin/go-humanize/times.go b/vendor/github.com/dustin/go-humanize/times.go new file mode 100644 index 0000000..dd3fbf5 --- /dev/null +++ b/vendor/github.com/dustin/go-humanize/times.go @@ -0,0 +1,117 @@ +package humanize + +import ( + "fmt" + "math" + "sort" + "time" +) + +// Seconds-based time units +const ( + Day = 24 * time.Hour + Week = 7 * Day + Month = 30 * Day + Year = 12 * Month + LongTime = 37 * Year +) + +// Time formats a time into a relative string. +// +// Time(someT) -> "3 weeks ago" +func Time(then time.Time) string { + return RelTime(then, time.Now(), "ago", "from now") +} + +// A RelTimeMagnitude struct contains a relative time point at which +// the relative format of time will switch to a new format string. A +// slice of these in ascending order by their "D" field is passed to +// CustomRelTime to format durations. +// +// The Format field is a string that may contain a "%s" which will be +// replaced with the appropriate signed label (e.g. "ago" or "from +// now") and a "%d" that will be replaced by the quantity. +// +// The DivBy field is the amount of time the time difference must be +// divided by in order to display correctly. +// +// e.g. if D is 2*time.Minute and you want to display "%d minutes %s" +// DivBy should be time.Minute so whatever the duration is will be +// expressed in minutes. +type RelTimeMagnitude struct { + D time.Duration + Format string + DivBy time.Duration +} + +var defaultMagnitudes = []RelTimeMagnitude{ + {time.Second, "now", time.Second}, + {2 * time.Second, "1 second %s", 1}, + {time.Minute, "%d seconds %s", time.Second}, + {2 * time.Minute, "1 minute %s", 1}, + {time.Hour, "%d minutes %s", time.Minute}, + {2 * time.Hour, "1 hour %s", 1}, + {Day, "%d hours %s", time.Hour}, + {2 * Day, "1 day %s", 1}, + {Week, "%d days %s", Day}, + {2 * Week, "1 week %s", 1}, + {Month, "%d weeks %s", Week}, + {2 * Month, "1 month %s", 1}, + {Year, "%d months %s", Month}, + {18 * Month, "1 year %s", 1}, + {2 * Year, "2 years %s", 1}, + {LongTime, "%d years %s", Year}, + {math.MaxInt64, "a long while %s", 1}, +} + +// RelTime formats a time into a relative string. +// +// It takes two times and two labels. In addition to the generic time +// delta string (e.g. 5 minutes), the labels are used applied so that +// the label corresponding to the smaller time is applied. +// +// RelTime(timeInPast, timeInFuture, "earlier", "later") -> "3 weeks earlier" +func RelTime(a, b time.Time, albl, blbl string) string { + return CustomRelTime(a, b, albl, blbl, defaultMagnitudes) +} + +// CustomRelTime formats a time into a relative string. +// +// It takes two times two labels and a table of relative time formats. +// In addition to the generic time delta string (e.g. 5 minutes), the +// labels are used applied so that the label corresponding to the +// smaller time is applied. +func CustomRelTime(a, b time.Time, albl, blbl string, magnitudes []RelTimeMagnitude) string { + lbl := albl + diff := b.Sub(a) + + if a.After(b) { + lbl = blbl + diff = a.Sub(b) + } + + n := sort.Search(len(magnitudes), func(i int) bool { + return magnitudes[i].D > diff + }) + + if n >= len(magnitudes) { + n = len(magnitudes) - 1 + } + mag := magnitudes[n] + args := []interface{}{} + escaped := false + for _, ch := range mag.Format { + if escaped { + switch ch { + case 's': + args = append(args, lbl) + case 'd': + args = append(args, diff/mag.DivBy) + } + escaped = false + } else { + escaped = ch == '%' + } + } + return fmt.Sprintf(mag.Format, args...) +} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/README.md b/vendor/github.com/elazarl/go-bindata-assetfs/README.md deleted file mode 100644 index 27ee48f..0000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# go-bindata-assetfs - -Serve embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`. - -[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs) - -### Installation - -Install with - - $ go get github.com/jteeuwen/go-bindata/... - $ go get github.com/elazarl/go-bindata-assetfs/... - -### Creating embedded data - -Usage is identical to [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) usage, -instead of running `go-bindata` run `go-bindata-assetfs`. - -The tool will create a `bindata_assetfs.go` file, which contains the embedded data. - -A typical use case is - - $ go-bindata-assetfs data/... - -### Using assetFS in your code - -The generated file provides an `assetFS()` function that returns a `http.Filesystem` -wrapping the embedded files. What you usually want to do is: - - http.Handle("/", http.FileServer(assetFS())) - -This would run an HTTP server serving the embedded files. - -## Without running binary tool - -You can always just run the `go-bindata` tool, and then - -use - - import "github.com/elazarl/go-bindata-assetfs" - ... - http.Handle("/", - http.FileServer( - &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: AssetInfo, Prefix: "data"})) - -to serve files embedded from the `data` directory. diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go b/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go deleted file mode 100644 index 04f6d7a..0000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go +++ /dev/null @@ -1,167 +0,0 @@ -package assetfs - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "time" -) - -var ( - defaultFileTimestamp = time.Now() -) - -// FakeFile implements os.FileInfo interface for a given path and size -type FakeFile struct { - // Path is the path of this file - Path string - // Dir marks of the path is a directory - Dir bool - // Len is the length of the fake file, zero if it is a directory - Len int64 - // Timestamp is the ModTime of this file - Timestamp time.Time -} - -func (f *FakeFile) Name() string { - _, name := filepath.Split(f.Path) - return name -} - -func (f *FakeFile) Mode() os.FileMode { - mode := os.FileMode(0644) - if f.Dir { - return mode | os.ModeDir - } - return mode -} - -func (f *FakeFile) ModTime() time.Time { - return f.Timestamp -} - -func (f *FakeFile) Size() int64 { - return f.Len -} - -func (f *FakeFile) IsDir() bool { - return f.Mode().IsDir() -} - -func (f *FakeFile) Sys() interface{} { - return nil -} - -// AssetFile implements http.File interface for a no-directory file with content -type AssetFile struct { - *bytes.Reader - io.Closer - FakeFile -} - -func NewAssetFile(name string, content []byte, timestamp time.Time) *AssetFile { - if timestamp.IsZero() { - timestamp = defaultFileTimestamp - } - return &AssetFile{ - bytes.NewReader(content), - ioutil.NopCloser(nil), - FakeFile{name, false, int64(len(content)), timestamp}} -} - -func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) { - return nil, errors.New("not a directory") -} - -func (f *AssetFile) Size() int64 { - return f.FakeFile.Size() -} - -func (f *AssetFile) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetDirectory implements http.File interface for a directory -type AssetDirectory struct { - AssetFile - ChildrenRead int - Children []os.FileInfo -} - -func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory { - fileinfos := make([]os.FileInfo, 0, len(children)) - for _, child := range children { - _, err := fs.AssetDir(filepath.Join(name, child)) - fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0, time.Time{}}) - } - return &AssetDirectory{ - AssetFile{ - bytes.NewReader(nil), - ioutil.NopCloser(nil), - FakeFile{name, true, 0, time.Time{}}, - }, - 0, - fileinfos} -} - -func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) { - if count <= 0 { - return f.Children, nil - } - if f.ChildrenRead+count > len(f.Children) { - count = len(f.Children) - f.ChildrenRead - } - rv := f.Children[f.ChildrenRead : f.ChildrenRead+count] - f.ChildrenRead += count - return rv, nil -} - -func (f *AssetDirectory) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetFS implements http.FileSystem, allowing -// embedded files to be served from net/http package. -type AssetFS struct { - // Asset should return content of file in path if exists - Asset func(path string) ([]byte, error) - // AssetDir should return list of files in the path - AssetDir func(path string) ([]string, error) - // AssetInfo should return the info of file in path if exists - AssetInfo func(path string) (os.FileInfo, error) - // Prefix would be prepended to http requests - Prefix string -} - -func (fs *AssetFS) Open(name string) (http.File, error) { - name = path.Join(fs.Prefix, name) - if len(name) > 0 && name[0] == '/' { - name = name[1:] - } - if b, err := fs.Asset(name); err == nil { - timestamp := defaultFileTimestamp - if fs.AssetInfo != nil { - if info, err := fs.AssetInfo(name); err == nil { - timestamp = info.ModTime() - } - } - return NewAssetFile(name, b, timestamp), nil - } - if children, err := fs.AssetDir(name); err == nil { - return NewAssetDirectory(name, children, fs), nil - } else { - // If the error is not found, return an error that will - // result in a 404 error. Otherwise the server returns - // a 500 error for files not found. - if strings.Contains(err.Error(), "not found") { - return nil, os.ErrNotExist - } - return nil, err - } -} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go b/vendor/github.com/elazarl/go-bindata-assetfs/doc.go deleted file mode 100644 index a664249..0000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go +++ /dev/null @@ -1,13 +0,0 @@ -// assetfs allows packages to serve static content embedded -// with the go-bindata tool with the standard net/http package. -// -// See https://github.com/jteeuwen/go-bindata for more information -// about embedding binary data with go-bindata. -// -// Usage example, after running -// $ go-bindata data/... -// use: -// http.Handle("/", -// http.FileServer( -// &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"})) -package assetfs diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs/main.go b/vendor/github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs/main.go new file mode 100644 index 0000000..fdaad5e --- /dev/null +++ b/vendor/github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs/main.go @@ -0,0 +1,100 @@ +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "os" + "os/exec" + "strings" +) + +const bindatafile = "bindata.go" + +func isDebug(args []string) bool { + flagset := flag.NewFlagSet("", flag.ContinueOnError) + debug := flagset.Bool("debug", false, "") + debugArgs := make([]string, 0) + for _, arg := range args { + if strings.HasPrefix(arg, "-debug") { + debugArgs = append(debugArgs, arg) + } + } + flagset.Parse(debugArgs) + if debug == nil { + return false + } + return *debug +} + +func main() { + if _, err := exec.LookPath("go-bindata"); err != nil { + fmt.Println("Cannot find go-bindata executable in path") + fmt.Println("Maybe you need: go get github.com/elazarl/go-bindata-assetfs/...") + os.Exit(1) + } + cmd := exec.Command("go-bindata", os.Args[1:]...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + os.Exit(1) + } + in, err := os.Open(bindatafile) + if err != nil { + fmt.Fprintln(os.Stderr, "Cannot read", bindatafile, err) + return + } + out, err := os.Create("bindata_assetfs.go") + if err != nil { + fmt.Fprintln(os.Stderr, "Cannot write 'bindata_assetfs.go'", err) + return + } + debug := isDebug(os.Args[1:]) + r := bufio.NewReader(in) + done := false + for line, isPrefix, err := r.ReadLine(); err == nil; line, isPrefix, err = r.ReadLine() { + if !isPrefix { + line = append(line, '\n') + } + if _, err := out.Write(line); err != nil { + fmt.Fprintln(os.Stderr, "Cannot write to 'bindata_assetfs.go'", err) + return + } + if !done && !isPrefix && bytes.HasPrefix(line, []byte("import (")) { + if debug { + fmt.Fprintln(out, "\t\"net/http\"") + } else { + fmt.Fprintln(out, "\t\"github.com/elazarl/go-bindata-assetfs\"") + } + done = true + } + } + if debug { + fmt.Fprintln(out, ` +func assetFS() http.FileSystem { + for k := range _bintree.Children { + return http.Dir(k) + } + panic("unreachable") +}`) + } else { + fmt.Fprintln(out, ` +func assetFS() *assetfs.AssetFS { + assetInfo := func(path string) (os.FileInfo, error) { + return os.Stat(path) + } + for k := range _bintree.Children { + return &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: assetInfo, Prefix: k} + } + panic("unreachable") +}`) + } + // Close files BEFORE remove calls (don't use defer). + in.Close() + out.Close() + if err := os.Remove(bindatafile); err != nil { + fmt.Fprintln(os.Stderr, "Cannot remove", bindatafile, err) + } +} diff --git a/vendor/github.com/gohugoio/hugo/docs/LICENSE.md b/vendor/github.com/gohugoio/hugo/docs/LICENSE.md deleted file mode 100644 index b62a9b5..0000000 --- a/vendor/github.com/gohugoio/hugo/docs/LICENSE.md +++ /dev/null @@ -1,194 +0,0 @@ -Apache License -============== - -_Version 2.0, January 2004_ -_<>_ - -### Terms and Conditions for use, reproduction, and distribution - -#### 1. Definitions - -“License” shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -“Licensor” shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -“Legal Entity” shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, “control” means **(i)** the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the -outstanding shares, or **(iii)** beneficial ownership of such entity. - -“You” (or “Your”) shall mean an individual or Legal Entity exercising -permissions granted by this License. - -“Source” form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -“Object” form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -“Work” shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -“Derivative Works” shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -“Contribution” shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -“submitted” means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as “Not a Contribution.” - -“Contributor” shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -#### 2. Grant of Copyright License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -#### 3. Grant of Patent License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -#### 4. Redistribution - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -* **(a)** You must give any other recipients of the Work or Derivative Works a copy of -this License; and -* **(b)** You must cause any modified files to carry prominent notices stating that You -changed the files; and -* **(c)** You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. - -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -#### 5. Submission of Contributions - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -#### 6. Trademarks - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -#### 7. Disclaimer of Warranty - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -#### 8. Limitation of Liability - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -#### 9. Accepting Warranty or Additional Liability - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -_END OF TERMS AND CONDITIONS_ - -### APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets `[]` replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same “printed page” as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/gohugoio/hugo/docs/content/about/license.md b/vendor/github.com/gohugoio/hugo/docs/content/about/license.md deleted file mode 100644 index a8e7c4a..0000000 --- a/vendor/github.com/gohugoio/hugo/docs/content/about/license.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: Apache License -linktitle: License -description: Hugo v0.15 and later are released under the Apache 2.0 license. -date: 2016-02-01 -publishdate: 2016-02-01 -lastmod: 2016-03-02 -categories: ["about hugo"] -keywords: ["License","apache"] -menu: - docs: - parent: "about" - weight: 60 -weight: 60 -sections_weight: 60 -aliases: [/meta/license] -toc: true ---- - -{{% note %}} -Hugo v0.15 and later are released under the Apache 2.0 license. -Earlier versions of Hugo were released under the [Simple Public License](https://opensource.org/licenses/Simple-2.0). -{{% /note %}} - -_Version 2.0, January 2004_
- - -*Terms and Conditions for use, reproduction, and distribution* - -## 1. Definitions - -“License” shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -“Licensor” shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -“Legal Entity” shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, “control” means **(i)** the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the -outstanding shares, or **(iii)** beneficial ownership of such entity. - -“You” (or “Your”) shall mean an individual or Legal Entity exercising -permissions granted by this License. - -“Source” form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -“Object” form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -“Work” shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -“Derivative Works” shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -“Contribution” shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -“submitted” means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as “Not a Contribution.” - -“Contributor” shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -## 2. Grant of Copyright License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -## 3. Grant of Patent License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -## 4. Redistribution - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -* **(a)** You must give any other recipients of the Work or Derivative Works a copy of -this License; and -* **(b)** You must cause any modified files to carry prominent notices stating that You -changed the files; and -* **\(c)** You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -## 5. Submission of Contributions - -Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -## 6. Trademarks - -This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -## 7. Disclaimer of Warranty - -Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -## 8. Limitation of Liability - -In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -## 9. Accepting Warranty or Additional Liability - -While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -_END OF TERMS AND CONDITIONS_ - -## APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets `[]` replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives. - -{{< code file="apache-notice.txt" download="apache-notice.txt" >}} -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -{{< /code >}} diff --git a/vendor/github.com/gohugoio/hugo/docs/content/content-management/authors.md b/vendor/github.com/gohugoio/hugo/docs/content/content-management/authors.md deleted file mode 100644 index afc94fa..0000000 --- a/vendor/github.com/gohugoio/hugo/docs/content/content-management/authors.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Authors -linktitle: Authors -description: -date: 2016-08-22 -publishdate: 2017-03-12 -lastmod: 2017-03-12 -keywords: [authors] -categories: ["content management"] -menu: - docs: - parent: "content-management" - weight: 55 -weight: 55 #rem -draft: true -aliases: [/content/archetypes/] -toc: true -comments: Before this page is published, need to also update both site- and page-level variables documentation. ---- - - - -Larger sites often have multiple content authors. Hugo provides standardized author profiles to organize relationships between content and content creators for sites operating under a distributed authorship model. - -## Author Profiles - -You can create a profile containing metadata for each author on your website. These profiles have to be saved under `data/_authors/`. The filename of the profile will later be used as an identifier. This way Hugo can associate content with one or multiple authors. An author's profile can be defined in the JSON, YAML, or TOML format. - -### Example: Author Profile - -Let's suppose Alice Allison is a blogger. A simple unique identifier would be `alice`. Now, we have to create a file called `alice.toml` in the `data/_authors/` directory. The following example is the standardized template written in TOML: - -{{< code file="data/_authors/alice.toml" >}} -givenName = "Alice" # or firstName as alias -familyName = "Allison" # or lastName as alias -displayName = "Alice Allison" -thumbnail = "static/authors/alice-thumb.jpg" -image = "static/authors/alice-full.jpg" -shortBio = "My name is Alice and I'm a blogger." -bio = "My name is Alice and I'm a blogger... some other stuff" -email = "alice.allison@email.com" -weight = 10 - -[social] - facebook = "alice.allison" - twitter = "alice" - googleplus = "aliceallison1" - website = "www.example.com" - -[params] - random = "whatever you want" -{{< /code >}} - -All variables are optional but it's advised to fill all important ones (e.g. names and biography) because themes can vary in their usage. - -You can store files for the `thumbnail` and `image` attributes in the `static` folder. Then add the path to the photos relative to `static`; e.g., `/static/path/to/thumbnail.jpg`. - -`weight` allows you to define the order of an author in an `.Authors` list and can be accessed on list or via the `.Site.Authors` variable. - -The `social` section contains all the links to the social network accounts of an author. Hugo is able to generate the account links for the most popular social networks automatically. This way, you only have to enter your username. You can find a list of all supported social networks [here](#linking-social-network-accounts-automatically). All other variables, like `website` in the example above remain untouched. - -The `params` section can contain arbitrary data much like the same-named section in the config file. What it contains is up to you. - -## Associate Content Through Identifiers - -Earlier it was mentioned that content can be associated with an author through their corresponding identifier. In our case, blogger Alice has the identifier `alice`. In the front matter of a content file, you can create a list of identifiers and assign it to the `authors` variable. Here are examples for `alice` using YAML and TOML, respectively. - -``` ---- -title: Why Hugo is so Awesome -date: 2016-08-22T14:27:502:00 -authors: ["alice"] ---- - -Nothing to read here. Move along... -``` - -``` -+++ -title = Why Hugo is so Awesome -date = "2016-08-22T14:27:502:00" -authors: ["alice"] -+++ - -Nothing to read here. Move along... -``` - -Future authors who might work on this blog post can append their identifiers to the `authors` array in the front matter as well. - -## Work with Templates - -After a successful setup it's time to give some credit to the authors by showing them on the website. Within the templates Hugo provides a list of the author's profiles if they are listed in the `authors` variable within the front matter. - -The list is accessible via the `.Authors` template variable. Printing all authors of a the blog post is straight forward: - -``` -{{ range .Authors }} - {{ .DisplayName }} -{{ end }} -=> Alice Allison -``` - -Even if there are co-authors you may only want to show the main author. For this case you can use the `.Author` template variable **(note the singular form)**. The template variable contains the profile of the author that is first listed with his identifier in the front matter. - -{{% note %}} -You can find a list of all template variables to access the profile information in [Author Variables](/variables/authors/). -{{% /note %}} - -### Link Social Network Accounts - -As aforementioned, Hugo is able to generate links to profiles of the most popular social networks. The following social networks with their corrersponding identifiers are supported: `github`, `facebook`, `twitter`, `googleplus`, `pinterest`, `instagram`, `youtube` and `linkedin`. - -This is can be done with the `.Social.URL` function. Its only parameter is the name of the social network as they are defined in the profile (e.g. `facebook`, `googleplus`). Custom variables like `website` remain as they are. - -Most articles feature a small section with information about the author at the end. Let's create one containing the author's name, a thumbnail, a (summarized) biography and links to all social networks: - -{{< code file="layouts/partials/author-info.html" download="author-info.html" >}} -{{ with .Author }} -

{{ .DisplayName }}

- {{ .DisplayName }} -

{{ .ShortBio }}

-
    - {{ range $network, $username := .Social }} -
  • {{ $network }}
  • - {{ end }} -
-{{ end }} -{{< /code >}} - -## Who Published What? - -That question can be answered with a list of all authors and another list containing all articles that they each have written. Now we have to translate this idea into templates. The [taxonomy][] feature allows us to logically group content based on information that they have in common; e.g. a tag or a category. Well, many articles share the same author, so this should sound familiar, right? - -In order to let Hugo know that we want to group content based on their author, we have to create a new taxonomy called `author` (the name corresponds to the variable in the front matter). Here is the snippet in a `config.yaml` and `config.toml`, respectively: - -``` -taxonomies: - author: authors -``` - -``` -[taxonomies] - author = "authors" -``` - - -### List All Authors - -In the next step we can create a template to list all authors of your website. Later, the list can be accessed at `www.example.com/authors/`. Create a new template in the `layouts/taxonomy/` directory called `authors.term.html`. This template will be exclusively used for this taxonomy. - -{{< code file="layouts/taxonomy/author.term.html" download="author.term.html" >}} - -{{< /code >}} - -`.Data.Terms` contains the identifiers of all authors and we can range over it to create a list with all author names. The `$profile` variable gives us access to the profile of the current author. This allows you to generate a nice info box with a thumbnail, a biography and social media links, like at the [end of a blog post](#linking-social-network-accounts-automatically). - -### List Each Author's Publications - -Last but not least, we have to create the second list that contains all publications of an author. Each list will be shown in its own page and can be accessed at `www.example.com/authors/`. Replace `` with a valid author identifier like `alice`. - -The layout for this page can be defined in the template `layouts/taxonomy/author.html`. - -{{< code file="layouts/taxonomy/author.html" download="author.html" >}} -{{ range .Data.Pages }} -

{{ .Title }}

- written by {{ .Author.DisplayName }} - {{ .Summary }} -{{ end }} -{{< /code >}} - -The example above generates a simple list of all posts written by a single author. Inside the loop you've access to the complete set of [page variables][pagevars]. Therefore, you can add additional information about the current posts like the publishing date or the tags. - -With a lot of content this list can quickly become very long. Consider to use the [pagination][] feature. It splits the list into smaller chunks and spreads them over multiple pages. - -[pagevars]: /variables/page/ -[pagination]: /templates/pagination/ diff --git a/vendor/github.com/tomnomnom/linkheader/.gitignore b/vendor/github.com/tomnomnom/linkheader/.gitignore new file mode 100644 index 0000000..0a00dde --- /dev/null +++ b/vendor/github.com/tomnomnom/linkheader/.gitignore @@ -0,0 +1,2 @@ +cpu.out +linkheader.test diff --git a/vendor/github.com/tomnomnom/linkheader/.travis.yml b/vendor/github.com/tomnomnom/linkheader/.travis.yml new file mode 100644 index 0000000..cfda086 --- /dev/null +++ b/vendor/github.com/tomnomnom/linkheader/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.6 + - 1.7 + - tip diff --git a/vendor/github.com/tomnomnom/linkheader/CONTRIBUTING.mkd b/vendor/github.com/tomnomnom/linkheader/CONTRIBUTING.mkd new file mode 100644 index 0000000..0339bec --- /dev/null +++ b/vendor/github.com/tomnomnom/linkheader/CONTRIBUTING.mkd @@ -0,0 +1,10 @@ +# Contributing + +* Raise an issue if appropriate +* Fork the repo +* Bootstrap the dev dependencies (run `./script/bootstrap`) +* Make your changes +* Use [gofmt](https://golang.org/cmd/gofmt/) +* Make sure the tests pass (run `./script/test`) +* Make sure the linters pass (run `./script/lint`) +* Issue a pull request diff --git a/vendor/github.com/gohugoio/hugo/docs/themes/gohugoioTheme/license.md b/vendor/github.com/tomnomnom/linkheader/LICENSE similarity index 97% rename from vendor/github.com/gohugoio/hugo/docs/themes/gohugoioTheme/license.md rename to vendor/github.com/tomnomnom/linkheader/LICENSE index c0522a3..55192df 100644 --- a/vendor/github.com/gohugoio/hugo/docs/themes/gohugoioTheme/license.md +++ b/vendor/github.com/tomnomnom/linkheader/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Bud Parr +Copyright (c) 2016 Tom Hudson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/tomnomnom/linkheader/README.mkd b/vendor/github.com/tomnomnom/linkheader/README.mkd new file mode 100644 index 0000000..2a949ca --- /dev/null +++ b/vendor/github.com/tomnomnom/linkheader/README.mkd @@ -0,0 +1,35 @@ +# Golang Link Header Parser + +Library for parsing HTTP Link headers. Requires Go 1.6 or higher. + +Docs can be found on [the GoDoc page](https://godoc.org/github.com/tomnomnom/linkheader). + +[![Build Status](https://travis-ci.org/tomnomnom/linkheader.svg)](https://travis-ci.org/tomnomnom/linkheader) + +## Basic Example + +```go +package main + +import ( + "fmt" + + "github.com/tomnomnom/linkheader" +) + +func main() { + header := "; rel=\"next\"," + + "; rel=\"last\"" + links := linkheader.Parse(header) + + for _, link := range links { + fmt.Printf("URL: %s; Rel: %s\n", link.URL, link.Rel) + } +} + +// Output: +// URL: https://api.github.com/user/58276/repos?page=2; Rel: next +// URL: https://api.github.com/user/58276/repos?page=2; Rel: last +``` + + diff --git a/vendor/github.com/tomnomnom/linkheader/main.go b/vendor/github.com/tomnomnom/linkheader/main.go new file mode 100644 index 0000000..6b81321 --- /dev/null +++ b/vendor/github.com/tomnomnom/linkheader/main.go @@ -0,0 +1,151 @@ +// Package linkheader provides functions for parsing HTTP Link headers +package linkheader + +import ( + "fmt" + "strings" +) + +// A Link is a single URL and related parameters +type Link struct { + URL string + Rel string + Params map[string]string +} + +// HasParam returns if a Link has a particular parameter or not +func (l Link) HasParam(key string) bool { + for p := range l.Params { + if p == key { + return true + } + } + return false +} + +// Param returns the value of a parameter if it exists +func (l Link) Param(key string) string { + for k, v := range l.Params { + if key == k { + return v + } + } + return "" +} + +// String returns the string representation of a link +func (l Link) String() string { + + p := make([]string, 0, len(l.Params)) + for k, v := range l.Params { + p = append(p, fmt.Sprintf("%s=\"%s\"", k, v)) + } + if l.Rel != "" { + p = append(p, fmt.Sprintf("%s=\"%s\"", "rel", l.Rel)) + } + return fmt.Sprintf("<%s>; %s", l.URL, strings.Join(p, "; ")) +} + +// Links is a slice of Link structs +type Links []Link + +// FilterByRel filters a group of Links by the provided Rel attribute +func (l Links) FilterByRel(r string) Links { + links := make(Links, 0) + for _, link := range l { + if link.Rel == r { + links = append(links, link) + } + } + return links +} + +// String returns the string representation of multiple Links +// for use in HTTP responses etc +func (l Links) String() string { + if l == nil { + return fmt.Sprint(nil) + } + + var strs []string + for _, link := range l { + strs = append(strs, link.String()) + } + return strings.Join(strs, ", ") +} + +// Parse parses a raw Link header in the form: +// ; rel="foo", ; rel="bar"; wat="dis" +// returning a slice of Link structs +func Parse(raw string) Links { + var links Links + + // One chunk: ; rel="foo" + for _, chunk := range strings.Split(raw, ",") { + + link := Link{URL: "", Rel: "", Params: make(map[string]string)} + + // Figure out what each piece of the chunk is + for _, piece := range strings.Split(chunk, ";") { + + piece = strings.Trim(piece, " ") + if piece == "" { + continue + } + + // URL + if piece[0] == '<' && piece[len(piece)-1] == '>' { + link.URL = strings.Trim(piece, "<>") + continue + } + + // Params + key, val := parseParam(piece) + if key == "" { + continue + } + + // Special case for rel + if strings.ToLower(key) == "rel" { + link.Rel = val + } else { + link.Params[key] = val + } + } + + if link.URL != "" { + links = append(links, link) + } + } + + return links +} + +// ParseMultiple is like Parse, but accepts a slice of headers +// rather than just one header string +func ParseMultiple(headers []string) Links { + links := make(Links, 0) + for _, header := range headers { + links = append(links, Parse(header)...) + } + return links +} + +// parseParam takes a raw param in the form key="val" and +// returns the key and value as seperate strings +func parseParam(raw string) (key, val string) { + + parts := strings.SplitN(raw, "=", 2) + if len(parts) == 1 { + return parts[0], "" + } + if len(parts) != 2 { + return "", "" + } + + key = parts[0] + val = strings.Trim(parts[1], "\"") + + return key, val + +} diff --git a/vendor/github.com/urfave/cli/generate-flag-types b/vendor/github.com/urfave/cli/generate-flag-types old mode 100755 new mode 100644 diff --git a/vendor/github.com/urfave/cli/runtests b/vendor/github.com/urfave/cli/runtests old mode 100755 new mode 100644 diff --git a/vendor/github.com/voxelbrain/goptions/.gitignore b/vendor/github.com/voxelbrain/goptions/.gitignore new file mode 100644 index 0000000..bf9dfdc --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/.gitignore @@ -0,0 +1,2 @@ +*.swp +.DS_Store diff --git a/vendor/github.com/voxelbrain/goptions/CHANGELOG.md b/vendor/github.com/voxelbrain/goptions/CHANGELOG.md new file mode 100644 index 0000000..32ec7ca --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/CHANGELOG.md @@ -0,0 +1,96 @@ +# Changelog +## 2.5.6 +### Bug fixes + +* Unexported fields are now ignored + +### Minor changes + +* Examples for Verbs and Remainder in documentation + +## 2.5.4 +### Bugfixes + +* Fix typo in documentation + +## 2.5.3 +### Bugfixes + +* Remove placeholders from LICENSE +* Add CONTROBUTORS + +## 2.5.2 +### Bugfixes + +* Bring `examples/readme_example.go` and `README.md` up to date +* Rewrite formatter + +## 2.5.1 +### Bugfixes + +* Make arrays of `goptions.Marshaler` work + +## 2.5.0 +### New features + +* Add support for `int32` and `int64` +* Add support for `float32` and `float64` + +### Bugfixes + +* Fix a bug where the name of a unknown type would not be properly + printed +* Fix checks whether to use `os.Stdin` or `os.Stdout` when "-" is given for a + `*os.File` +* Fix an test example where the output to `os.Stderr` is apparently + not evaluated anymore. + +## 2.4.1 +### Bugfixes + +* Code was not compilable due to temporary [maintainer](http://github.com/surma) idiocy + (Thanks [akrennmair](http://github.com/akrennmair)) + +## 2.4.0 +### New features + +* Gave `goptions.FlagSet` a `ParseAndFail()` method + +## 2.3.0 +### New features + +* Add support for `time.Duration` + +## 2.2.0 +### New features + +* Add support for `*net.TCPAddr` +* Add support for `*net/url.URL` + +### Bugfixes + +* Fix behaviour of `[]bool` fields + +## 2.1.0 +### New features + +* `goptions.Verbs` is of type `string` and will have selected verb name as value + after parsing. + +## 2.0.0 +### Breaking changes + +* Disallow multiple flag names for one member +* Remove `accumulate` option in favor of generic array support + +### New features + +* Add convenience function `ParseAndFail` to make common usage of the library + a one-liner (see `readme_example.go`) +* Add a `Marshaler` interface to enable thrid-party types +* Add support for slices (and thereby for mutiple flag definitions) + +### Minor changes + +* Refactoring to get more flexibility +* Make a flag's default value accessible in the template context diff --git a/vendor/github.com/voxelbrain/goptions/CONTRIBUTORS.md b/vendor/github.com/voxelbrain/goptions/CONTRIBUTORS.md new file mode 100644 index 0000000..65d757b --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/CONTRIBUTORS.md @@ -0,0 +1,7 @@ +Contributors +============ + +These people have contributed to goptions's design and implementation: + + * Andreas Krennmair + * GDG Berlin Golang diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE b/vendor/github.com/voxelbrain/goptions/LICENSE.txt similarity index 50% rename from vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE rename to vendor/github.com/voxelbrain/goptions/LICENSE.txt index e67cdab..44f1148 100644 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE +++ b/vendor/github.com/voxelbrain/goptions/LICENSE.txt @@ -1,20 +1,22 @@ -Copyright (c) 2013 Honza Pokorny +Copyright (c) 2012-2013, voxelbrain UG, Germany All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the voxelbrain UG nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +DISCLAIMED. IN NO EVENT SHALL voxelbrain UG BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT diff --git a/vendor/github.com/voxelbrain/goptions/README.md b/vendor/github.com/voxelbrain/goptions/README.md new file mode 100644 index 0000000..0f31aef --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/README.md @@ -0,0 +1,114 @@ +`goptions` implements a flexible parser for command line options. + +Key targets were the support for both long and short flag versions, mutually +exclusive flags, and verbs. Flags and their corresponding variables are defined +by the tags in a (possibly anonymous) struct. + +![](https://circleci.com/gh/voxelbrain/goptions.png?circle-token=27cd98362d475cfa8c586565b659b2204733f25c) + +# Example + +```go +package main + +import ( + "github.com/voxelbrain/goptions" + "os" + "time" +) + +func main() { + options := struct { + Servers []string `goptions:"-s, --server, obligatory, description='Servers to connect to'"` + Password string `goptions:"-p, --password, description='Don\\'t prompt for password'"` + Timeout time.Duration `goptions:"-t, --timeout, description='Connection timeout in seconds'"` + Help goptions.Help `goptions:"-h, --help, description='Show this help'"` + + goptions.Verbs + Execute struct { + Command string `goptions:"--command, mutexgroup='input', description='Command to exectute', obligatory"` + Script *os.File `goptions:"--script, mutexgroup='input', description='Script to exectute', rdonly"` + } `goptions:"execute"` + Delete struct { + Path string `goptions:"-n, --name, obligatory, description='Name of the entity to be deleted'"` + Force bool `goptions:"-f, --force, description='Force removal'"` + } `goptions:"delete"` + }{ // Default values goes here + Timeout: 10 * time.Second, + } + goptions.ParseAndFail(&options) +} +``` + +``` +$ go run examples/readme_example.go --help +Usage: a.out [global options] [verb options] + +Global options: + -s, --server Servers to connect to (*) + -p, --password Don't prompt for password + -t, --timeout Connection timeout in seconds (default: 10s) + -h, --help Show this help + +Verbs: + delete: + -n, --name Name of the entity to be deleted (*) + -f, --force Force removal + execute: + --command Command to exectute (*) + --script Script to exectute +``` + +# Quick Reference + +## goptions + +Each field of your struct can be tagged with a `goptions` + +```go + FieldName type `goptions:"-S, --long, options..."` +``` + +Where the short options (`-S`) are declared with a single dash and +long options (`--long`) are declared with two dashes. Either or +both may be declared. + +After the short/long option names are one or more of the following: + +### Global Options + +* description='...' +* obligatory +* mutexgroup='GROUP_NAME' + +### os.File specific + +* create +* append +* rdonly +* wronly +* rdwr +* excl +* sync +* trunc +* perm=0777 + +## Supported Types + +* bool +* string +* float64 +* float32 +* int +* int64 +* int32 +* goptions.Help +* *os.File +* *net.TCPAddr +* *url.URL +* time.Duration + + + +--- +Version 2.5.11 diff --git a/vendor/github.com/voxelbrain/goptions/circle.yml b/vendor/github.com/voxelbrain/goptions/circle.yml new file mode 100644 index 0000000..b399d44 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/circle.yml @@ -0,0 +1,9 @@ +version: 2 +jobs: + build: + docker: + - image: circleci/golang + steps: + - checkout + - run: go get -d . + - run: go test diff --git a/vendor/github.com/voxelbrain/goptions/flag.go b/vendor/github.com/voxelbrain/goptions/flag.go new file mode 100644 index 0000000..0af05b4 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/flag.go @@ -0,0 +1,90 @@ +package goptions + +import ( + "fmt" + "reflect" + "strings" +) + +// Flag represents a single flag of a FlagSet. +type Flag struct { + Short string + Long string + MutexGroups []string + Description string + Obligatory bool + WasSpecified bool + value reflect.Value + optionMeta map[string]interface{} + DefaultValue interface{} +} + +// Return the name of the flag preceding the right amount of dashes. +// The long name is preferred. If no name has been specified, "" +// will be returned. +func (f *Flag) Name() string { + if len(f.Long) > 0 { + return "--" + f.Long + } + if len(f.Short) > 0 { + return "-" + f.Short + } + return "" +} + +// NeedsExtraValue returns true if the flag expects a separate value. +func (f *Flag) NeedsExtraValue() bool { + // Explicit over implicit + if f.value.Type() == reflect.TypeOf(new([]bool)).Elem() || + f.value.Type() == reflect.TypeOf(new(bool)).Elem() { + return false + } + if _, ok := f.value.Interface().(Help); ok { + return false + } + return true +} + +// IsMulti returns true if the flag can be specified multiple times. +func (f *Flag) IsMulti() bool { + if f.value.Kind() == reflect.Slice { + return true + } + return false +} + +func isShort(arg string) bool { + return strings.HasPrefix(arg, "-") && !strings.HasPrefix(arg, "--") && len(arg) >= 2 +} + +func isLong(arg string) bool { + return strings.HasPrefix(arg, "--") && len(arg) >= 3 +} + +func (f *Flag) Handles(arg string) bool { + return (isShort(arg) && arg[1:2] == f.Short) || + (isLong(arg) && arg[2:] == f.Long) + +} + +func (f *Flag) Parse(args []string) ([]string, error) { + param, value := args[0], "" + if f.NeedsExtraValue() && + (len(args) < 2 || (isShort(param) && len(param) > 2)) { + return args, fmt.Errorf("Flag %s needs an argument", f.Name()) + } + if f.WasSpecified && !f.IsMulti() { + return args, fmt.Errorf("Flag %s can only be specified once", f.Name()) + } + if isShort(param) && len(param) > 2 { + // Short flag cluster + args[0] = "-" + param[2:] + } else if f.NeedsExtraValue() { + value = args[1] + args = args[2:] + } else { + args = args[1:] + } + f.WasSpecified = true + return args, f.setValue(value) +} diff --git a/vendor/github.com/voxelbrain/goptions/flagset.go b/vendor/github.com/voxelbrain/goptions/flagset.go new file mode 100644 index 0000000..cf31038 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/flagset.go @@ -0,0 +1,240 @@ +package goptions + +import ( + "errors" + "fmt" + "io" + "os" + "reflect" + "strings" + "sync" +) + +// A FlagSet represents one set of flags which belong to one particular program. +// A FlagSet is also used to represent a subset of flags belonging to one verb. +type FlagSet struct { + // This HelpFunc will be called when PrintHelp() is called. + HelpFunc + // Name of the program. Might be used by HelpFunc. + Name string + helpFlag *Flag + remainderFlag *Flag + shortMap map[string]*Flag + longMap map[string]*Flag + verbFlag *Flag + // Global option flags + Flags []*Flag + // Verbs and corresponding FlagSets + Verbs map[string]*FlagSet + parent *FlagSet +} + +// NewFlagSet returns a new FlagSet containing all the flags which result from +// parsing the tags of the struct. Said struct as to be passed to the function +// as a pointer. +// If a tag line is erroneous, NewFlagSet() panics as this is considered a +// compile time error rather than a runtme error. +func NewFlagSet(name string, v interface{}) *FlagSet { + structValue := reflect.ValueOf(v) + if structValue.Kind() != reflect.Ptr { + panic("Value type is not a pointer to a struct") + } + structValue = structValue.Elem() + if structValue.Kind() != reflect.Struct { + panic("Value type is not a pointer to a struct") + } + return newFlagset(name, structValue, nil) +} + +// Internal version which skips type checking and takes the "parent"'s +// remainder flag as a parameter. +func newFlagset(name string, structValue reflect.Value, parent *FlagSet) *FlagSet { + var once sync.Once + r := &FlagSet{ + Name: name, + Flags: make([]*Flag, 0), + HelpFunc: DefaultHelpFunc, + parent: parent, + } + + if parent != nil && parent.remainderFlag != nil { + r.remainderFlag = parent.remainderFlag + } + + var i int + // Parse Option fields + for i = 0; i < structValue.Type().NumField(); i++ { + // Skip unexported fields + if StartsWithLowercase(structValue.Type().Field(i).Name) { + continue + } + + fieldValue := structValue.Field(i) + tag := structValue.Type().Field(i).Tag.Get("goptions") + flag, err := parseStructField(fieldValue, tag) + + if err != nil { + panic(fmt.Sprintf("Invalid struct field: %s", err)) + } + if fieldValue.Type().Name() == "Verbs" { + r.verbFlag = flag + break + } + if fieldValue.Type().Name() == "Help" { + r.helpFlag = flag + } + if fieldValue.Type().Name() == "Remainder" && r.remainderFlag == nil { + r.remainderFlag = flag + } + + if len(tag) != 0 { + r.Flags = append(r.Flags, flag) + } + } + + // Parse verb fields + for i++; i < structValue.Type().NumField(); i++ { + once.Do(func() { + r.Verbs = make(map[string]*FlagSet) + }) + fieldValue := structValue.Field(i) + tag := structValue.Type().Field(i).Tag.Get("goptions") + r.Verbs[tag] = newFlagset(tag, fieldValue, r) + } + r.createMaps() + return r +} + +var ( + ErrHelpRequest = errors.New("Request for Help") +) + +// Parse takes the command line arguments and sets the corresponding values +// in the FlagSet's struct. +func (fs *FlagSet) Parse(args []string) (err error) { + // Parse global flags + for len(args) > 0 { + if !((isLong(args[0]) && fs.hasLongFlag(args[0][2:])) || + (isShort(args[0]) && fs.hasShortFlag(args[0][1:2]))) { + break + } + f := fs.FlagByName(args[0]) + args, err = f.Parse(args) + if err != nil { + return + } + if f == fs.helpFlag && f.WasSpecified { + return ErrHelpRequest + } + } + + // Process verb + if len(args) > 0 { + if verb, ok := fs.Verbs[args[0]]; ok { + fs.verbFlag.value.Set(reflect.ValueOf(Verbs(args[0]))) + err := verb.Parse(args[1:]) + if err != nil { + return err + } + args = args[0:0] + } + } + + // Process remainder + if len(args) > 0 { + if fs.remainderFlag == nil { + return fmt.Errorf("Invalid trailing arguments: %v", args) + } + remainder := reflect.MakeSlice(fs.remainderFlag.value.Type(), len(args), len(args)) + reflect.Copy(remainder, reflect.ValueOf(args)) + fs.remainderFlag.value.Set(remainder) + } + + // Check for unset, obligatory, single Flags + for _, f := range fs.Flags { + if f.Obligatory && !f.WasSpecified && len(f.MutexGroups) == 0 { + return fmt.Errorf("%s must be specified", f.Name()) + } + } + + // Check for multiple set Flags in one mutex group + // Check also for unset, obligatory mutex groups + mgs := fs.MutexGroups() + for _, mg := range mgs { + if !mg.IsValid() { + return fmt.Errorf("Exactly one of %s must be specified", strings.Join(mg.Names(), ", ")) + } + } + return nil +} + +func (fs *FlagSet) createMaps() { + fs.longMap = make(map[string]*Flag) + fs.shortMap = make(map[string]*Flag) + for _, flag := range fs.Flags { + fs.longMap[flag.Long] = flag + fs.shortMap[flag.Short] = flag + } +} + +func (fs *FlagSet) hasLongFlag(fname string) bool { + _, ok := fs.longMap[fname] + return ok +} + +func (fs *FlagSet) hasShortFlag(fname string) bool { + _, ok := fs.shortMap[fname] + return ok +} + +func (fs *FlagSet) FlagByName(fname string) *Flag { + if isShort(fname) && fs.hasShortFlag(fname[1:2]) { + return fs.shortMap[fname[1:2]] + } else if isLong(fname) && fs.hasLongFlag(fname[2:]) { + return fs.longMap[fname[2:]] + } + return nil +} + +// MutexGroups returns a map of Flag lists which contain mutually +// exclusive flags. +func (fs *FlagSet) MutexGroups() map[string]MutexGroup { + r := make(map[string]MutexGroup) + for _, f := range fs.Flags { + for _, mg := range f.MutexGroups { + if len(mg) == 0 { + continue + } + if _, ok := r[mg]; !ok { + r[mg] = make(MutexGroup, 0) + } + r[mg] = append(r[mg], f) + } + } + return r +} + +// Prints the FlagSet's help to the given writer. +func (fs *FlagSet) PrintHelp(w io.Writer) { + fs.HelpFunc(w, fs) +} + +func (fs *FlagSet) ParseAndFail(w io.Writer, args []string) { + err := fs.Parse(args) + if err != nil { + errCode := 0 + if err != ErrHelpRequest { + errCode = 1 + fmt.Fprintf(w, "Error: %s\n", err) + } + fs.PrintHelp(w) + os.Exit(errCode) + } +} + +func StartsWithLowercase(s string) bool { + if len(s) <= 0 { + return false + } + return strings.ToLower(s)[0] == s[0] +} diff --git a/vendor/github.com/voxelbrain/goptions/goptions.go b/vendor/github.com/voxelbrain/goptions/goptions.go new file mode 100644 index 0000000..992f7ee --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/goptions.go @@ -0,0 +1,99 @@ +/* +package goptions implements a flexible parser for command line options. + +Key targets were the support for both long and short flag versions, mutually +exclusive flags, and verbs. Flags and their corresponding variables are defined +by the tags in a (possibly anonymous) struct. + + var options struct { + Name string `goptions:"-n, --name"` + Force bool `goptions:"-f, --force"` + Verbosity int `goptions:"-v, --verbose"` + } + +Short flags can be combined (e.g. `-nfv`). Long flags take their value after a +separating space. The equals notation (`--long-flag=value`) is NOT supported +right now. + +Every member of the struct which is supposed to catch a command line value +has to have a "goptions" tag. The contains the short and long flag names for this +member but can additionally specify any of these options below. + + obligatory - Flag must be specified. Otherwise an error will be returned + when Parse() is called. + description='...' - Set the description for this particular flag. Will be + used by the HelpFunc. + mutexgroup='...' - Add this flag to a MutexGroup. Only one flag of the + ones sharing a MutexGroup can be set. Otherwise an error + will be returned when Parse() is called. If one flag in a + MutexGroup is `obligatory` one flag of the group must be + specified. A flag can be in multiple MutexGroups at once. + +Depending on the type of the struct member, additional options might become available: + + Type: *os.File + The given string is interpreted as a path to a file. If the string is "-" + os.Stdin or os.Stdout will be used. os.Stdin will be returned, if the + `rdonly` flag was set. os.Stdout will be returned, if `wronly` was set. + Available options: + Any combination of create, append, rdonly, wronly, rdwr, + excl, sync, trunc and perm can be specified and correspond directly with + the combination of the homonymous flags in the os package. + + Type: *net.TCPAddr + The given string is interpreted as a tcp address. It is passed to + net.ResolvTCPAddr() with "tcp" as the network type identifier. + + Type: *net/url.URL + The given string is parsed by net/url.Parse() + + Type: time.Duration + The given string is parsed by time.ParseDuration() + +If a member is a slice type, multiple definitions of the flags are possible. For each +specification the underlying type will be used. + + var options struct { + Servers []string `goptions:"-s, --server, description='Servers to connect to'"` + }{} + +goptions also has support for verbs. Each verb accepts its own set of flags which +take exactly the same tag format as global options. For an usage example of verbs +see the PrintHelp() example. +*/ +package goptions + +import ( + "os" + "path/filepath" +) + +const ( + VERSION = "2.5.11" +) + +var ( + globalFlagSet *FlagSet +) + +// ParseAndFail is a convenience function to parse os.Args[1:] and print +// the help if an error occurs. This should cover 90% of this library's +// applications. +func ParseAndFail(v interface{}) { + globalFlagSet = NewFlagSet(filepath.Base(os.Args[0]), v) + globalFlagSet.ParseAndFail(os.Stderr, os.Args[1:]) +} + +// Parse parses the command-line flags from os.Args[1:]. +func Parse(v interface{}) error { + globalFlagSet = NewFlagSet(filepath.Base(os.Args[0]), v) + return globalFlagSet.Parse(os.Args[1:]) +} + +// PrintHelp renders the default help to os.Stderr. +func PrintHelp() { + if globalFlagSet == nil { + panic("Must call Parse() before PrintHelp()") + } + globalFlagSet.PrintHelp(os.Stderr) +} diff --git a/vendor/github.com/voxelbrain/goptions/helpfunc.go b/vendor/github.com/voxelbrain/goptions/helpfunc.go new file mode 100644 index 0000000..3b0165e --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/helpfunc.go @@ -0,0 +1,72 @@ +package goptions + +import ( + "io" + "sync" + "text/tabwriter" + "text/template" +) + +// HelpFunc is the signature of a function responsible for printing the help. +type HelpFunc func(w io.Writer, fs *FlagSet) + +// Generates a new HelpFunc taking a `text/template.Template`-formatted +// string as an argument. The resulting template will be executed with the FlagSet +// as its data. +func NewTemplatedHelpFunc(tpl string) HelpFunc { + var once sync.Once + var t *template.Template + return func(w io.Writer, fs *FlagSet) { + once.Do(func() { + t = template.Must(template.New("helpTemplate").Parse(tpl)) + }) + err := t.Execute(w, fs) + if err != nil { + panic(err) + } + } +} + +const ( + _DEFAULT_HELP = "\xffUsage: {{.Name}} [global options] {{with .Verbs}} [verb options]{{end}}\n" + + "\n" + + "Global options:\xff" + + "{{range .Flags}}" + + "\n\t" + + "\t{{with .Short}}" + "-{{.}}," + "{{end}}" + + "\t{{with .Long}}" + "--{{.}}" + "{{end}}" + + "\t{{.Description}}" + + "{{with .DefaultValue}}" + + " (default: {{.}})" + + "{{end}}" + + "{{if .Obligatory}}" + + " (*)" + + "{{end}}" + + "{{end}}" + + "\xff\n\n{{with .Verbs}}Verbs:\xff" + + "{{range .}}" + + "\xff\n {{.Name}}:\xff" + + "{{range .Flags}}" + + "\n\t" + + "\t{{with .Short}}" + "-{{.}}," + "{{end}}" + + "\t{{with .Long}}" + "--{{.}}" + "{{end}}" + + "\t{{.Description}}" + + "{{with .DefaultValue}}" + + " (default: {{.}})" + + "{{end}}" + + "{{if .Obligatory}}" + + " (*)" + + "{{end}}" + + "{{end}}" + + "{{end}}" + + "{{end}}" + + "\n" +) + +// DefaultHelpFunc is a HelpFunc which renders the default help template and pipes +// the output through a text/tabwriter.Writer before flushing it to the output. +func DefaultHelpFunc(w io.Writer, fs *FlagSet) { + tw := tabwriter.NewWriter(w, 4, 4, 1, ' ', tabwriter.StripEscape|tabwriter.DiscardEmptyColumns) + NewTemplatedHelpFunc(_DEFAULT_HELP)(tw, fs) + tw.Flush() +} diff --git a/vendor/github.com/voxelbrain/goptions/marshaler.go b/vendor/github.com/voxelbrain/goptions/marshaler.go new file mode 100644 index 0000000..b79cc60 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/marshaler.go @@ -0,0 +1,5 @@ +package goptions + +type Marshaler interface { + MarshalGoption(s string) error +} diff --git a/vendor/github.com/voxelbrain/goptions/mutexgroup.go b/vendor/github.com/voxelbrain/goptions/mutexgroup.go new file mode 100644 index 0000000..14c2053 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/mutexgroup.go @@ -0,0 +1,48 @@ +package goptions + +// A MutexGroup holds a set of flags which are mutually exclusive and cannot +// be specified at the same time. +type MutexGroup []*Flag + +// IsObligatory returns true if exactly one of the flags in the MutexGroup has +// to be specified +func (mg MutexGroup) IsObligatory() bool { + for _, flag := range mg { + if flag.Obligatory { + return true + } + } + return false +} + +func (mg MutexGroup) WasSpecified() bool { + for _, flag := range mg { + if flag.WasSpecified { + return true + } + } + return false +} + +// IsValid checks if the flags in the MutexGroup describe a valid state. +// I.e. At most one has been specified or – if it is an obligatory MutexGroup – +// exactly one has been specified. +func (mg MutexGroup) IsValid() bool { + c := 0 + for _, flag := range mg { + if flag.WasSpecified { + c++ + } + } + return c <= 1 && (!mg.IsObligatory() || c == 1) +} + +// Names is a convenience function to return the array of names of the flags +// in the MutexGroup. +func (mg MutexGroup) Names() []string { + r := make([]string, len(mg)) + for i, flag := range mg { + r[i] = flag.Name() + } + return r +} diff --git a/vendor/github.com/voxelbrain/goptions/options.go b/vendor/github.com/voxelbrain/goptions/options.go new file mode 100644 index 0000000..86ed6bc --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/options.go @@ -0,0 +1,136 @@ +package goptions + +import ( + "fmt" + "os" + "reflect" + "strconv" + "strings" + "time" +) + +type optionFunc func(f *Flag, option, value string) error +type optionMap map[string]optionFunc + +var ( + typeOptionMap = map[reflect.Type]optionMap{ + // Global options + nil: optionMap{ + "description": description, + "obligatory": obligatory, + "mutexgroup": mutexgroup, + }, + reflect.TypeOf(new(time.Time)).Elem(): optionMap{ + "format": time_format, + }, + reflect.TypeOf(new(*os.File)).Elem(): optionMap{ + "create": initOptionMeta(file_create, "file_mode", 0), + "append": initOptionMeta(file_append, "file_mode", 0), + "rdonly": initOptionMeta(file_rdonly, "file_mode", 0), + "wronly": initOptionMeta(file_wronly, "file_mode", 0), + "rdwr": initOptionMeta(file_rdwr, "file_mode", 0), + "excl": initOptionMeta(file_excl, "file_mode", 0), + "sync": initOptionMeta(file_sync, "file_mode", 0), + "trunc": initOptionMeta(file_trunc, "file_mode", 0), + "perm": file_perm, + }, + } +) + +// Wraps another optionFunc and inits optionMeta[field] with value if it does +// not have one already. +func initOptionMeta(fn optionFunc, field string, init_value interface{}) optionFunc { + return func(f *Flag, option, value string) error { + if _, ok := f.optionMeta[field]; !ok { + f.optionMeta[field] = init_value + } + return fn(f, option, value) + } +} + +func description(f *Flag, option, value string) error { + f.Description = strings.Replace(value, `\`, ``, -1) + return nil +} + +func obligatory(f *Flag, option, value string) error { + f.Obligatory = true + return nil +} + +func mutexgroup(f *Flag, option, value string) error { + if len(value) <= 0 { + return fmt.Errorf("Mutexgroup option needs a value") + } + for _, group := range strings.Split(value, ",") { + f.MutexGroups = append(f.MutexGroups, group) + } + return nil +} + +func file_create(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_CREATE + return nil +} + +func file_append(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_APPEND + return nil +} + +func file_rdonly(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_RDONLY + return nil +} + +func file_wronly(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_WRONLY + return nil +} + +func file_rdwr(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_RDWR + return nil +} + +func file_excl(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_EXCL + return nil +} + +func file_sync(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_SYNC + return nil +} + +func file_trunc(f *Flag, option, value string) error { + f.optionMeta["file_mode"] = f.optionMeta["file_mode"].(int) | os.O_TRUNC + return nil +} + +func file_perm(f *Flag, option, value string) error { + perm, err := strconv.ParseInt(value, 8, 32) + if err != nil { + return err + } + f.optionMeta["file_perm"] = uint32(perm) + return nil +} + +func time_format(f *Flag, option, value string) error { + f.optionMeta["format"] = value + return nil +} + +func optionMapForType(t reflect.Type) optionMap { + g := typeOptionMap[nil] + m, _ := typeOptionMap[t] + r := make(optionMap) + for k, v := range g { + r[k] = v + } + for k, v := range m { + r[k] = v + } + return r +} diff --git a/vendor/github.com/voxelbrain/goptions/special_types.go b/vendor/github.com/voxelbrain/goptions/special_types.go new file mode 100644 index 0000000..dc0078f --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/special_types.go @@ -0,0 +1,14 @@ +package goptions + +// Help Defines the common help flag. It is handled separately as it will cause +// Parse() to return ErrHelpRequest. +type Help bool + +// Verbs marks the point in the struct where the verbs start. Its value will be +// the name of the selected verb. +type Verbs string + +// A remainder catches all excessive arguments. If both a verb and +// the containing options struct have a remainder field, only the latter one +// will be used. +type Remainder []string diff --git a/vendor/github.com/voxelbrain/goptions/tagparser.go b/vendor/github.com/voxelbrain/goptions/tagparser.go new file mode 100644 index 0000000..7a507e9 --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/tagparser.go @@ -0,0 +1,68 @@ +package goptions + +import ( + "fmt" + "reflect" + "regexp" + "strings" +) + +const ( + _LONG_FLAG_REGEXP = `--[[:word:]-]+` + _SHORT_FLAG_REGEXP = `-[[:alnum:]]` + _QUOTED_STRING_REGEXP = `'((?:\\'|[^\\'])+)'` + _OPTION_REGEXP = `([[:word:]-]+)(?:=` + _QUOTED_STRING_REGEXP + `)?` +) + +var ( + optionRegexp = regexp.MustCompile(`^(` + strings.Join([]string{_SHORT_FLAG_REGEXP, _LONG_FLAG_REGEXP, _OPTION_REGEXP}, "|") + `)(?:,|$)`) +) + +func parseStructField(fieldValue reflect.Value, tag string) (*Flag, error) { + f := &Flag{ + value: fieldValue, + DefaultValue: fieldValue.Interface(), + optionMeta: make(map[string]interface{}), + } + for { + tag = strings.TrimSpace(tag) + if len(tag) == 0 { + break + } + idx := optionRegexp.FindStringSubmatchIndex(tag) + if idx == nil { + return nil, fmt.Errorf("Could not find a valid flag definition at the beginning of \"%s\"", tag) + } + option := tag[idx[2]:idx[3]] + + if strings.HasPrefix(option, "--") { + if f.Long != "" { + return nil, fmt.Errorf("Multiple flags assigned to a member: %s", strings.Join([]string{"--" + f.Long, option}, ", ")) + } + f.Long = option[2:] + } else if strings.HasPrefix(option, "-") { + if f.Short != "" { + return nil, fmt.Errorf("Multiple flags assigned to a member: %s", strings.Join([]string{"-" + f.Short, option}, ", ")) + } + f.Short = option[1:] + } else { + option := tag[idx[4]:idx[5]] + value := "" + if idx[6] != -1 { + value = tag[idx[6]:idx[7]] + } + optionmap := optionMapForType(fieldValue.Type()) + opf, ok := optionmap[option] + if !ok { + return nil, fmt.Errorf("Unknown option %s", option) + } + err := opf(f, option, value) + if err != nil { + return nil, fmt.Errorf("Option %s invalid: %s", option, err) + } + } + // Keep remainder + tag = tag[idx[1]:] + } + return f, nil +} diff --git a/vendor/github.com/voxelbrain/goptions/valueparser.go b/vendor/github.com/voxelbrain/goptions/valueparser.go new file mode 100644 index 0000000..e8176fa --- /dev/null +++ b/vendor/github.com/voxelbrain/goptions/valueparser.go @@ -0,0 +1,163 @@ +package goptions + +import ( + "fmt" + "net" + "net/url" + "os" + "reflect" + "strconv" + "time" +) + +type valueParser func(f *Flag, val string) (reflect.Value, error) + +var ( + parserMap = map[reflect.Type]valueParser{ + reflect.TypeOf(new(bool)).Elem(): boolValueParser, + reflect.TypeOf(new(string)).Elem(): stringValueParser, + reflect.TypeOf(new(float64)).Elem(): float64ValueParser, + reflect.TypeOf(new(float32)).Elem(): float32ValueParser, + reflect.TypeOf(new(int)).Elem(): intValueParser, + reflect.TypeOf(new(int64)).Elem(): int64ValueParser, + reflect.TypeOf(new(int32)).Elem(): int32ValueParser, + reflect.TypeOf(new(Help)).Elem(): helpValueParser, + reflect.TypeOf(new(*os.File)).Elem(): fileValueParser, + reflect.TypeOf(new(*net.TCPAddr)).Elem(): tcpAddrValueParser, + reflect.TypeOf(new(*url.URL)).Elem(): urlValueParser, + reflect.TypeOf(new(time.Duration)).Elem(): durationValueParser, + reflect.TypeOf(new(time.Time)).Elem(): timeValueParser, + } +) + +func parseMarshalValue(value reflect.Value, s string) error { + newval := reflect.New(value.Type()).Elem() + if newval.Kind() == reflect.Ptr { + newptrval := reflect.New(value.Type().Elem()) + newval.Set(newptrval) + } + err := newval.Interface().(Marshaler).MarshalGoption(s) + value.Set(newval) + return err +} + +func (f *Flag) setValue(s string) (err error) { + defer func() { + if x := recover(); x != nil { + err = x.(error) + return + } + }() + if f.value.Type().Implements(reflect.TypeOf(new(Marshaler)).Elem()) { + return parseMarshalValue(f.value, s) + } + vtype := f.value.Type() + newval := reflect.New(vtype).Elem() + if f.value.Kind() == reflect.Slice { + vtype = f.value.Type().Elem() + if vtype.Implements(reflect.TypeOf(new(Marshaler)).Elem()) { + newval = reflect.New(vtype).Elem() + err := parseMarshalValue(newval, s) + f.value.Set(reflect.Append(f.value, newval)) + return err + } + } + if parser, ok := parserMap[vtype]; ok { + val, err := parser(f, s) + if err != nil { + return err + } + if f.value.Kind() == reflect.Slice { + f.value.Set(reflect.Append(f.value, val)) + } else { + f.value.Set(val) + } + return nil + } else { + return fmt.Errorf("Unsupported flag type: %s", f.value.Type()) + } + panic("Invalid execution path") +} + +func boolValueParser(f *Flag, val string) (reflect.Value, error) { + return reflect.ValueOf(true), nil +} + +func stringValueParser(f *Flag, val string) (reflect.Value, error) { + return reflect.ValueOf(val), nil +} + +func float64ValueParser(f *Flag, val string) (reflect.Value, error) { + floatval, err := strconv.ParseFloat(val, 64) + return reflect.ValueOf(float64(floatval)), err +} + +func float32ValueParser(f *Flag, val string) (reflect.Value, error) { + floatval, err := strconv.ParseFloat(val, 32) + return reflect.ValueOf(float32(floatval)), err +} + +func int64ValueParser(f *Flag, val string) (reflect.Value, error) { + intval, err := strconv.ParseInt(val, 10, 64) + return reflect.ValueOf(int64(intval)), err +} + +func int32ValueParser(f *Flag, val string) (reflect.Value, error) { + intval, err := strconv.ParseInt(val, 10, 32) + return reflect.ValueOf(int32(intval)), err +} + +func intValueParser(f *Flag, val string) (reflect.Value, error) { + intval, err := strconv.ParseInt(val, 10, 64) + return reflect.ValueOf(int(intval)), err +} + +func fileValueParser(f *Flag, val string) (reflect.Value, error) { + mode := 0 + if v, ok := f.optionMeta["file_mode"]; ok { + mode = v.(int) + } + if val == "-" { + if mode&1 == os.O_RDONLY { + return reflect.ValueOf(os.Stdin), nil + } else if mode&1 == os.O_WRONLY { + return reflect.ValueOf(os.Stdout), nil + } + } else { + perm := uint32(0644) + if v, ok := f.optionMeta["file_perm"].(uint32); ok { + perm = v + } + f, e := os.OpenFile(val, mode, os.FileMode(perm)) + return reflect.ValueOf(f), e + } + panic("Invalid execution path") +} + +func tcpAddrValueParser(f *Flag, val string) (reflect.Value, error) { + addr, err := net.ResolveTCPAddr("tcp", val) + return reflect.ValueOf(addr), err +} + +func urlValueParser(f *Flag, val string) (reflect.Value, error) { + url, err := url.Parse(val) + return reflect.ValueOf(url), err +} + +func durationValueParser(f *Flag, val string) (reflect.Value, error) { + d, err := time.ParseDuration(val) + return reflect.ValueOf(d), err +} + +func timeValueParser(f *Flag, val string) (reflect.Value, error) { + format := time.RFC3339 + if altFormat, ok := f.optionMeta["format"]; ok { + format = altFormat.(string) + } + d, err := time.Parse(format, val) + return reflect.ValueOf(d), err +} + +func helpValueParser(f *Flag, val string) (reflect.Value, error) { + return reflect.Value{}, ErrHelpRequest +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl b/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl b/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl b/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl b/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl b/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl old mode 100755 new mode 100644 diff --git a/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl b/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl old mode 100755 new mode 100644 diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto old mode 100755 new mode 100644 diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh old mode 100755 new mode 100644 diff --git a/vendor/gopkg.in/blang/semver.v1/LICENSE b/vendor/gopkg.in/blang/semver.v1/LICENSE new file mode 100644 index 0000000..5ba5c86 --- /dev/null +++ b/vendor/gopkg.in/blang/semver.v1/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Benedikt Lang + +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/gopkg.in/blang/semver.v1/README.md b/vendor/gopkg.in/blang/semver.v1/README.md new file mode 100644 index 0000000..d52057f --- /dev/null +++ b/vendor/gopkg.in/blang/semver.v1/README.md @@ -0,0 +1,132 @@ +semver for golang [![Build Status](https://drone.io/github.com/blang/semver/status.png)](https://drone.io/github.com/blang/semver/latest) [![GoDoc](https://godoc.org/github.com/blang/semver?status.png)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) +====== + +semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`. + +Usage +----- +```bash +$ go get github.com/blang/semver +``` + +```go +import github.com/blang/semver +v1, err := semver.New("1.0.0-beta") +v2, err := semver.New("2.0.0-beta") +v1.Compare(v2) +``` + +Also check the [GoDocs](http://godoc.org/github.com/blang/semver). + +Why should I use this lib? +----- + +- Fully spec compatible +- No reflection +- No regex +- Fully tested (Coverage >99%) +- Readable parsing/validation errors +- Fast (See [Benchmarks](#benchmarks)) +- Only Stdlib + + +Features +----- + +- Parsing and validation at all levels +- Comparator-like comparisons +- Compare Helper Methods +- InPlace manipulation +- database/sql compatible (sql.Scanner/Valuer) + + +Example +----- + +Have a look at full examples in [examples/main.go](examples/main.go) + +```go +import github.com/blang/semver + +v, err := semver.New("0.0.1-alpha.preview+123.github") +fmt.Printf("Major: %d\n", v.Major) +fmt.Printf("Minor: %d\n", v.Minor) +fmt.Printf("Patch: %d\n", v.Patch) +fmt.Printf("Pre: %s\n", v.Pre) +fmt.Printf("Build: %s\n", v.Build) + +// Prerelease versions array +if len(v.Pre) > 0 { + fmt.Println("Prerelease versions:") + for i, pre := range v.Pre { + fmt.Printf("%d: %q\n", i, pre) + } +} + +// Build meta data array +if len(v.Build) > 0 { + fmt.Println("Build meta data:") + for i, build := range v.Build { + fmt.Printf("%d: %q\n", i, build) + } +} + +v001, err := semver.New("0.0.1") +// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE +v001.GT(v) == true +v.LT(v001) == true +v.GTE(v) == true +v.LTE(v) == true + +// Or use v.Compare(v2) for comparisons (-1, 0, 1): +v001.Compare(v) == 1 +v.Compare(v001) == -1 +v.Compare(v) == 0 + +// Manipulate Version in place: +v.Pre[0], err = semver.NewPRVersion("beta") +if err != nil { + fmt.Printf("Error parsing pre release version: %q", err) +} + +fmt.Println("\nValidate versions:") +v.Build[0] = "?" + +err = v.Validate() +if err != nil { + fmt.Printf("Validation failed: %s\n", err) +} +``` + +Benchmarks +----- + + BenchmarkParseSimple 5000000 442 ns/op + BenchmarkParseComplex 1000000 2441 ns/op + BenchmarkParseAverage 1000000 1497 ns/op + BenchmarkValidateSimple 500000000 4.83 ns/op + BenchmarkValidateComplex 1000000 1236 ns/op + BenchmarkValidateAverage 5000000 580 ns/op + BenchmarkCompareSimple 500000000 5.43 ns/op + BenchmarkCompareComplex 100000000 26.3 ns/op + BenchmarkCompareAverage 100000000 29.6 ns/op + +See benchmark cases at [semver_test.go](semver_test.go) + + +Motivation +----- + +I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like. + + +Contribution +----- + +Feel free to make a pull request. For bigger changes create a issue first to discuss about it. + + +License +----- + +See [LICENSE](LICENSE) file. diff --git a/vendor/gopkg.in/blang/semver.v1/semver.go b/vendor/gopkg.in/blang/semver.v1/semver.go new file mode 100644 index 0000000..2c6889a --- /dev/null +++ b/vendor/gopkg.in/blang/semver.v1/semver.go @@ -0,0 +1,375 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers + dot = "." + hyphen = "-" + plus = "+" +) + +// Latest fully supported spec version +var SPEC_VERSION = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []*PRVersion + Build []string //No Precendence +} + +// Version to string +func (v Version) String() string { + versionArray := []string{ + strconv.FormatUint(v.Major, 10), + dot, + strconv.FormatUint(v.Minor, 10), + dot, + strconv.FormatUint(v.Patch, 10), + } + if len(v.Pre) > 0 { + versionArray = append(versionArray, hyphen) + for i, pre := range v.Pre { + if i > 0 { + versionArray = append(versionArray, dot) + } + versionArray = append(versionArray, pre.String()) + } + } + if len(v.Build) > 0 { + versionArray = append(versionArray, plus, strings.Join(v.Build, dot)) + } + return strings.Join(versionArray, "") +} + +// Checks if v is greater than o. +func (v Version) GT(o *Version) bool { + return (v.Compare(o) == 1) +} + +// Checks if v is greater than or equal to o. +func (v Version) GTE(o *Version) bool { + return (v.Compare(o) >= 0) +} + +// Checks if v is less than o. +func (v Version) LT(o *Version) bool { + return (v.Compare(o) == -1) +} + +// Checks if v is less than or equal to o. +func (v Version) LTE(o *Version) bool { + return (v.Compare(o) <= 0) +} + +// Compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o *Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } else { + return -1 + } + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } else { + return -1 + } + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } else { + return -1 + } + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } else { + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + + } +} + +// Validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + if len(v.Pre) > 0 { + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + } + + if len(v.Build) > 0 { + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + } + + return nil +} + +// Alias for Parse, parses version string and returns a validated Version or error +func New(s string) (*Version, error) { + return Parse(s) +} + +// Parses version string and returns a validated Version or error +func Parse(s string) (*Version, error) { + if len(s) == 0 { + return nil, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return nil, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return nil, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return nil, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return nil, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return nil, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return nil, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return nil, err + } + + preIndex := strings.Index(parts[2], "-") + buildIndex := strings.Index(parts[2], "+") + + // Determine last index of patch version (first of pre or build versions) + var subVersionIndex int + if preIndex != -1 && buildIndex == -1 { + subVersionIndex = preIndex + } else if preIndex == -1 && buildIndex != -1 { + subVersionIndex = buildIndex + } else if preIndex == -1 && buildIndex == -1 { + subVersionIndex = len(parts[2]) + } else { + // if there is no actual prversion but a hyphen inside the build meta data + if buildIndex < preIndex { + subVersionIndex = buildIndex + preIndex = -1 // Build meta data before preIndex found implicates there are no prerelease versions + } else { + subVersionIndex = preIndex + } + } + + if !containsOnly(parts[2][:subVersionIndex], numbers) { + return nil, fmt.Errorf("Invalid character(s) found in patch number %q", parts[2][:subVersionIndex]) + } + if hasLeadingZeroes(parts[2][:subVersionIndex]) { + return nil, fmt.Errorf("Patch number must not contain leading zeroes %q", parts[2][:subVersionIndex]) + } + patch, err := strconv.ParseUint(parts[2][:subVersionIndex], 10, 64) + if err != nil { + return nil, err + } + v := &Version{} + v.Major = major + v.Minor = minor + v.Patch = patch + + // There are PreRelease versions + if preIndex != -1 { + var preRels string + if buildIndex != -1 { + preRels = parts[2][subVersionIndex+1 : buildIndex] + } else { + preRels = parts[2][subVersionIndex+1:] + } + prparts := strings.Split(preRels, ".") + for _, prstr := range prparts { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return nil, err + } + v.Pre = append(v.Pre, parsedPR) + } + } + + // There is build meta data + if buildIndex != -1 { + buildStr := parts[2][buildIndex+1:] + buildParts := strings.Split(buildStr, ".") + for _, str := range buildParts { + if len(str) == 0 { + return nil, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return nil, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + } + + return v, nil +} + +// PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// Creates a new valid prerelease version +func NewPRVersion(s string) (*PRVersion, error) { + if len(s) == 0 { + return nil, errors.New("Prerelease is empty") + } + v := &PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return nil, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return nil, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return nil, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// Is pre release version numeric? +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compares PreRelease Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o *PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// Creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} diff --git a/vendor/gopkg.in/blang/semver.v1/sql.go b/vendor/gopkg.in/blang/semver.v1/sql.go new file mode 100644 index 0000000..f636f3d --- /dev/null +++ b/vendor/gopkg.in/blang/semver.v1/sql.go @@ -0,0 +1,31 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var strVal string + switch src.(type) { + case string: + strVal = src.(string) + case []byte: + strVal = string(src.([]byte)) + default: + return fmt.Errorf("Version.Scan: cannot convert %T to string.", src) + } + + tmpv, err := Parse(strVal) + if err != nil { + return + } + *v = *tmpv + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (s Version) Value() (driver.Value, error) { + return s.String(), nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..4fb2ac6 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,124 @@ +# github.com/Clever/gitsem v1.0.4 +github.com/Clever/gitsem +# github.com/Microsoft/go-winio v0.4.7 +github.com/Microsoft/go-winio +# github.com/aktau/github-release v0.7.2 +github.com/aktau/github-release +github.com/aktau/github-release/github +# github.com/andygrunwald/go-jira v1.3.0 +github.com/andygrunwald/go-jira +# github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3 +github.com/chzyer/readline +# github.com/containous/go-bindata v1.0.0 +github.com/containous/go-bindata/go-bindata +github.com/containous/go-bindata +# github.com/davecgh/go-spew v1.1.0 +github.com/davecgh/go-spew/spew +# github.com/docker/distribution v2.6.2+incompatible +github.com/docker/distribution/reference +github.com/docker/distribution/digest +# github.com/docker/docker v1.13.1 +github.com/docker/docker/api/types +github.com/docker/docker/client +github.com/docker/docker/api/types/container +github.com/docker/docker/api/types/filters +github.com/docker/docker/api/types/mount +github.com/docker/docker/api/types/network +github.com/docker/docker/api/types/registry +github.com/docker/docker/api/types/swarm +github.com/docker/docker/api/types/events +github.com/docker/docker/api/types/reference +github.com/docker/docker/api/types/time +github.com/docker/docker/api/types/versions +github.com/docker/docker/api/types/volume +github.com/docker/docker/pkg/tlsconfig +github.com/docker/docker/api/types/blkiodev +github.com/docker/docker/api/types/strslice +# github.com/docker/go-connections v0.3.0 +github.com/docker/go-connections/nat +github.com/docker/go-connections/sockets +github.com/docker/go-connections/tlsconfig +# github.com/docker/go-units v0.3.2 +github.com/docker/go-units +# github.com/dustin/go-humanize v1.0.0 +github.com/dustin/go-humanize +# github.com/elazarl/go-bindata-assetfs v0.0.0-20170227122030-30f82fa23fd8 +github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs +# github.com/fatih/color v1.6.0 +github.com/fatih/color +# github.com/fatih/structs v1.0.0 +github.com/fatih/structs +# github.com/fsnotify/fsnotify v1.4.7 +github.com/fsnotify/fsnotify +# github.com/gohugoio/hugo v0.37.1 +github.com/gohugoio/hugo/watcher +# github.com/golang/protobuf v1.0.0 +github.com/golang/protobuf/proto +# github.com/google/go-github v15.0.0+incompatible +github.com/google/go-github/github +# github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 +github.com/google/go-querystring/query +# github.com/gorilla/websocket v1.2.0 +github.com/gorilla/websocket +# github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 +github.com/jcelliott/lumber +# github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a +github.com/juju/ansiterm +github.com/juju/ansiterm/tabwriter +# github.com/lunixbochs/vtclean v0.0.0-20170504063817-d14193dfc626 +github.com/lunixbochs/vtclean +# github.com/manifoldco/promptui v0.0.0-20180308161052-c0c0d3afc6a0 +github.com/manifoldco/promptui +github.com/manifoldco/promptui/list +github.com/manifoldco/promptui/screenbuf +# github.com/mattn/go-colorable v0.0.9 +github.com/mattn/go-colorable +# github.com/mattn/go-isatty v0.0.3 +github.com/mattn/go-isatty +# github.com/mattn/go-runewidth v0.0.2 +github.com/mattn/go-runewidth +# github.com/nanobox-io/golang-scribble v0.0.0-20171026142921-ced58d671850 +github.com/nanobox-io/golang-scribble +# github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 +github.com/olekukonko/tablewriter +# github.com/pkg/errors v0.8.0 +github.com/pkg/errors +# github.com/robfig/cron v1.0.0 +github.com/robfig/cron +# github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c +github.com/skratchdot/open-golang/open +# github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 +github.com/tomnomnom/linkheader +# github.com/trivago/tgo v1.0.1 +github.com/trivago/tgo/tcontainer +github.com/trivago/tgo/treflect +# github.com/urfave/cli v1.20.0 +github.com/urfave/cli +# github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2 +github.com/voxelbrain/goptions +# github.com/xanzy/go-gitlab v0.10.7 +github.com/xanzy/go-gitlab +# github.com/yosssi/ace v0.0.5 +github.com/yosssi/ace +# golang.org/x/net v0.0.0-20180308154319-d0aafc73d5cd +golang.org/x/net/context +golang.org/x/net/context/ctxhttp +golang.org/x/net/proxy +# golang.org/x/oauth2 v0.0.0-20180312235849-7af32f14d0a2 +golang.org/x/oauth2 +golang.org/x/oauth2/internal +# golang.org/x/sys v0.0.0-20180302081741-dd2ff4accc09 +golang.org/x/sys/unix +golang.org/x/sys/windows +# google.golang.org/appengine v1.0.0 +google.golang.org/appengine/urlfetch +google.golang.org/appengine/internal +google.golang.org/appengine/internal/urlfetch +google.golang.org/appengine/internal/base +google.golang.org/appengine/internal/datastore +google.golang.org/appengine/internal/log +google.golang.org/appengine/internal/remote_api +# gopkg.in/blang/semver.v1 v1.1.0 +gopkg.in/blang/semver.v1 +# gopkg.in/yaml.v2 v2.1.1 +gopkg.in/yaml.v2