├── .gitignore ├── README.md ├── gist.go ├── go.mod └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | gist 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gist 2 | 3 | > Command line tool for publishing gists 4 | 5 | ## Usage: 6 | 7 | ``` sh 8 | # read from stdin 9 | cat file.sh | gist 10 | 11 | # set file name 12 | cat file.sh | gist -f "myfile.sh" 13 | 14 | # make public 15 | cat file.sh | gist -p 16 | 17 | # multiple files 18 | gist *.js 19 | ``` 20 | 21 | ## Install: 22 | 23 | ``` sh 24 | go get github.com/icholy/gist 25 | ``` 26 | 27 | For auth, the tool looks for an environment variable called `GITHUB_TOKEN` 28 | You can generate one at: https://github.com/settings/tokens 29 | 30 | ``` sh 31 | export GITHUB_TOKEN="blah blah blah" 32 | ``` 33 | 34 | -------------------------------------------------------------------------------- /gist.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "flag" 6 | "fmt" 7 | "io/ioutil" 8 | "log" 9 | "os" 10 | "path" 11 | 12 | "github.com/google/go-github/github" 13 | "golang.org/x/oauth2" 14 | ) 15 | 16 | var ( 17 | fileName string 18 | public bool 19 | token string 20 | ) 21 | 22 | func init() { 23 | flag.StringVar(&fileName, "f", "", "gist file name") 24 | flag.BoolVar(&public, "p", false, "make gist public") 25 | flag.StringVar(&token, "t", os.Getenv("GITHUB_TOKEN"), "github token") 26 | } 27 | 28 | type TokenSource oauth2.Token 29 | 30 | func (t *TokenSource) Token() (*oauth2.Token, error) { 31 | return (*oauth2.Token)(t), nil 32 | } 33 | 34 | type GistFiles map[github.GistFilename]github.GistFile 35 | 36 | func getFilesFromStdin() (GistFiles, error) { 37 | data, err := ioutil.ReadAll(os.Stdin) 38 | if err != nil { 39 | return nil, err 40 | } 41 | content := string(data) 42 | return GistFiles{ 43 | github.GistFilename(fileName): github.GistFile{ 44 | Content: &content, 45 | }, 46 | }, nil 47 | } 48 | 49 | func readFile(fname string) (string, error) { 50 | f, err := os.Open(fname) 51 | if err != nil { 52 | return "", err 53 | } 54 | defer f.Close() 55 | data, err := ioutil.ReadAll(f) 56 | if err != nil { 57 | return "", err 58 | } 59 | return string(data), nil 60 | } 61 | 62 | func getFilesFromArgs() (GistFiles, error) { 63 | files := make(GistFiles) 64 | for _, arg := range flag.Args() { 65 | content, err := readFile(arg) 66 | if err != nil { 67 | return nil, err 68 | } 69 | name := github.GistFilename(path.Base(arg)) 70 | files[name] = github.GistFile{ 71 | Content: &content, 72 | } 73 | } 74 | return files, nil 75 | } 76 | 77 | func getFiles() (GistFiles, error) { 78 | if flag.NArg() > 0 { 79 | return getFilesFromArgs() 80 | } else { 81 | return getFilesFromStdin() 82 | } 83 | } 84 | 85 | func main() { 86 | flag.Parse() 87 | files, err := getFiles() 88 | if err != nil { 89 | log.Fatal(err) 90 | } 91 | ts := TokenSource{AccessToken: token} 92 | client := github.NewClient( 93 | oauth2.NewClient(oauth2.NoContext, &ts), 94 | ) 95 | gist, _, err := client.Gists.Create(context.Background(), &github.Gist{ 96 | Files: files, 97 | Public: &public, 98 | }) 99 | if err != nil { 100 | log.Fatal(err) 101 | } 102 | fmt.Println(*gist.HTMLURL) 103 | } 104 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/icholy/gist 2 | 3 | require ( 4 | github.com/google/go-github v17.0.0+incompatible 5 | github.com/google/go-querystring v1.0.0 // indirect 6 | golang.org/x/net v0.0.0-20181217023233-e147a9138326 // indirect 7 | golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 8 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect 9 | google.golang.org/appengine v1.3.0 // indirect 10 | ) 11 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= 2 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 3 | github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= 4 | github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= 5 | github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= 6 | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 7 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 8 | golang.org/x/net v0.0.0-20181217023233-e147a9138326 h1:iCzOf0xz39Tstp+Tu/WwyGjUXCk34QhQORRxBeXXTA4= 9 | golang.org/x/net v0.0.0-20181217023233-e147a9138326/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 10 | golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 h1:uESlIz09WIHT2I+pasSXcpLYqYK8wHcdCetU3VuMBJE= 11 | golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 12 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= 13 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 14 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 15 | google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= 16 | google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 17 | --------------------------------------------------------------------------------