zaquestion: add program to learn contribution process
Change-Id: If0988b2cd42c3f34de671a645207fca633fc4162
Reviewed-on: https://go-review.googlesource.com/132300
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/zaquestion/main.go b/zaquestion/main.go
new file mode 100644
index 0000000..f9e3243
--- /dev/null
+++ b/zaquestion/main.go
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/adamryman/gophersay/gopher"
+)
+
+func main() {
+ fmt.Println("Learning to contribute to your favorite language at Gophercon 2018 is rad!")
+ fmt.Printf("Heres a proverb:\n\n")
+ gopher.Proverb(os.Stdout)
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+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 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.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
new file mode 100644
index 0000000..8bd32d1
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
@@ -0,0 +1,58 @@
+package gopher
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "math/rand"
+ "time"
+
+ "github.com/adamryman/gophersay/gopherart"
+)
+
+var (
+ sayings []string
+ gopherArt string
+)
+
+func init() {
+ // Load in gopher ascii art from go-bindata
+ gopherArtBytes, err := gopherart.Asset("gopherart/gopher.ascii")
+ if err != nil {
+ log.Fatal(err)
+ }
+ gopherArt = string(gopherArtBytes)
+ sayings = []string{
+ "Don't communicate by sharing memory, share memory by communicating.", "Concurrency is not parallelism.",
+ "Channels orchestrate; mutexes serialize.",
+ "The bigger the interface, the weaker the abstraction.",
+ "Make the zero value useful.",
+ "interface{} says nothing.",
+ "Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.",
+ "A little copying is better than a little dependency.",
+ "Syscall must always be guarded with build tags.",
+ "Cgo must always be guarded with build tags.",
+ "Cgo is not Go.",
+ "With the unsafe package there are no guarantees.",
+ "Clear is better than clever.",
+ "Reflection is never clear.",
+ "Errors are values.",
+ "Don't just check errors, handle them gracefully.",
+ "Design the architecture, name the components, document the details.",
+ "Documentation is for users.",
+ "Don't panic.",
+ }
+}
+
+func Proverb(w io.Writer) {
+ rand.Seed(time.Now().UnixNano())
+ saying := sayings[rand.Intn(len(sayings))]
+ Say(w, saying)
+}
+
+func Say(w io.Writer, saying string) {
+ fmt.Fprintf(w, " ------------------------\n%s\n%s",
+ saying,
+ gopherArt,
+ )
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
new file mode 100644
index 0000000..afc915a
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
@@ -0,0 +1,15 @@
+ ------------------------
+ \
+ \
+ \ ,_---~~~~~----._
+ _,,_,*^____ _____``*g*\"*,
+ / __/ /' ^. / \ ^@q f
+[ @f | @)) | | @)) l 0 _/
+ \`/ \~____ / __ \_____/ \
+ | _l__l_ I
+ } [______] I
+ ] | | | |
+ ] ~ ~ |
+ | |
+ | |
+
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
new file mode 100644
index 0000000..8f2bffa
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
@@ -0,0 +1,237 @@
+// Code generated by go-bindata.
+// sources:
+// gopherart/gopher.ascii
+// DO NOT EDIT!
+
+package gopherart
+
+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
+}
+
+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
+}
+
+var _gopherartGopherAscii = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x8e\x3d\x16\x82\x30\x10\x84\xfb\x9c\x62\x9e\x8d\x8f\xbc\x48\x3c\x02\xad\x67\x20\xb2\x54\xd8\xd0\xd8\x47\xce\xee\xec\xf2\x23\xc1\xa7\x03\x84\x64\xf6\xdb\xc9\xe2\xf2\x43\x0e\x40\xd2\x65\x59\x91\xf8\x05\x61\x65\x52\x29\x52\x0b\x56\x11\x91\x10\x24\xf8\x4e\xa8\xd9\xd3\x9d\xf4\xbd\x7f\xf8\x74\xf2\x81\x48\xa4\x15\x11\xcf\x56\xed\x6a\xd0\x58\x92\xbb\xe6\xc9\xff\x00\xd7\x02\xcd\x80\x8c\xa6\xaa\xb4\x92\xb1\xed\x47\xe0\x0a\xb6\x33\x27\xf5\xda\x98\x26\xbb\x4a\x43\x91\xec\xae\xb8\x8e\xe9\xac\x73\x93\x8c\xc2\x77\x67\xdc\x66\xe6\xf5\x71\x5a\x0b\x90\x7b\x09\x91\xd9\x3b\x0c\xcd\x45\xb0\x1e\x8e\x0c\x26\x3e\xdf\x4c\xd1\x76\x54\x9e\xe7\xf9\x0b\x19\xe3\xde\x01\x00\x00\xff\xff\xe9\x5c\x37\x0d\xaf\x01\x00\x00")
+
+func gopherartGopherAsciiBytes() ([]byte, error) {
+ return bindataRead(
+ _gopherartGopherAscii,
+ "gopherart/gopher.ascii",
+ )
+}
+
+func gopherartGopherAscii() (*asset, error) {
+ bytes, err := gopherartGopherAsciiBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "gopherart/gopher.ascii", size: 431, mode: os.FileMode(436), modTime: time.Unix(1468565140, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+// 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){
+ "gopherart/gopher.ascii": gopherartGopherAscii,
+}
+
+// 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
+}
+
+type bintree struct {
+ Func func() (*asset, error)
+ Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+ "gopherart": &bintree{nil, map[string]*bintree{
+ "gopher.ascii": &bintree{gopherartGopherAscii, map[string]*bintree{}},
+ }},
+}}
+
+// 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, "/")...)...)
+}