main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. _ "io/ioutil"
  6. "log"
  7. "net/http"
  8. "os"
  9. "regexp"
  10. "strings"
  11. )
  12. var (
  13. appRoot string
  14. regexes map[string]*regexp.Regexp
  15. assignRegex *regexp.Regexp
  16. )
  17. func init() {
  18. var err error
  19. appRoot, err = os.Getwd()
  20. if err != nil {
  21. log.Fatalf("Can't get working dir: %s", err)
  22. }
  23. // TODO update regex to look for things like:
  24. // TODO ability to add/filter regex
  25. // client("AKAI32fJ334...",
  26. regexes = map[string]*regexp.Regexp{
  27. "github": regexp.MustCompile(`[g|G][i|I][t|T][h|H][u|U][b|B].*(=|:|:=|<-).*\w+.*`),
  28. "aws": regexp.MustCompile(`[a|A][w|W][s|S].*(=|:=|:|<-).*\w+.*`),
  29. "heroku": regexp.MustCompile(`[h|H][e|E][r|R][o|O][k|K][u|U].*(=|:=|:|<-).*\w+.*`),
  30. "facebook": regexp.MustCompile(`[f|F][a|A][c|C][e|E][b|B][o|O][o|O][k|K].*(=|:=|:|<-).*\w+.*`),
  31. "twitter": regexp.MustCompile(`[t|T][w|W][i|I][t|T][t|T][e|E][r|R].*(=|:=|:|<-).*\w+.*`),
  32. "reddit": regexp.MustCompile(`[r|R][e|E][d|D][d|D][i|I][t|T].*(=|:=|:|<-).*\w+.*`),
  33. "twilio": regexp.MustCompile(`[t|T][w|W][i|I][l|L][i|I][o|O].*(=|:=|:|<-).*\w+.*`),
  34. }
  35. assignRegex = regexp.MustCompile(`(=|:|:=|<-)`)
  36. }
  37. func main() {
  38. args := os.Args[1:]
  39. opts := parseOptions(args)
  40. if opts.RepoURL != "" {
  41. start(opts)
  42. } else if opts.UserURL != "" || opts.OrgURL != "" {
  43. repoList := repoScan(opts)
  44. for _, repo := range repoList {
  45. opts.RepoURL = repo.RepoURL
  46. start(opts)
  47. }
  48. }
  49. }
  50. // RepoElem used for parsing json from github api
  51. type RepoElem struct {
  52. RepoURL string `json:"html_url"`
  53. }
  54. // repoScan attempts to parse all repo urls from an organization or user
  55. func repoScan(opts *Options) []RepoElem {
  56. var (
  57. targetURL string
  58. target string
  59. targetType string
  60. repoList []RepoElem
  61. )
  62. if opts.UserURL != "" {
  63. targetURL = opts.UserURL
  64. targetType = "users"
  65. } else {
  66. targetURL = opts.OrgURL
  67. targetType = "org"
  68. }
  69. splitTargetURL := strings.Split(targetURL, "/")
  70. target = splitTargetURL[len(splitTargetURL)-1]
  71. resp, err := http.Get(fmt.Sprintf("https://api.github.com/%s/%s/repos", targetType, target))
  72. if err != nil {
  73. log.Fatal(err)
  74. }
  75. defer resp.Body.Close()
  76. json.NewDecoder(resp.Body).Decode(&repoList)
  77. return repoList
  78. }