github.com/sona-tar/ghs@v0.0.0-20170415134710-bed1b2953748/repository.go (about) 1 package main 2 3 import ( 4 "sync" 5 6 "github.com/google/go-github/github" 7 "context" 8 ) 9 10 type Repo struct { 11 search *Search 12 maxItem int 13 printCount int 14 } 15 16 func NewRepo(s *Search) *Repo { 17 return &Repo{s, 0, 0} 18 } 19 20 func (r *Repo) Search(c context.Context) (<-chan []github.Repository, <-chan error) { 21 var wg sync.WaitGroup 22 reposBuff := make(chan []github.Repository, 1) 23 errChan := make(chan error, 1) 24 25 // 1st search 26 27 repos, lastPage, max, err := r.search.First(c) 28 if err != nil { 29 Debug("Error First()\n") 30 errChan <- err 31 return reposBuff, errChan 32 } 33 r.maxItem = max 34 // notify main thread of first search result 35 reposBuff <- repos 36 37 // 2nd - 10th search 38 go func() { 39 for page := 2; page < lastPage+1; page++ { 40 Debug("sub thread start %d\n", page) 41 wg.Add(1) 42 go func(p int) { 43 // notify main thread of 2nd - 10th search result 44 rs, err := r.search.Exec(c,p) 45 if err != nil { 46 Debug("sub thread error %d\n", p) 47 errChan <- err 48 } 49 reposBuff <- rs 50 wg.Done() 51 Debug("sub thread end %d\n", p) 52 }(page) 53 } 54 Debug("sub thread wait...\n") 55 wg.Wait() 56 Debug("sub thread wakeup!!\n") 57 close(reposBuff) 58 }() 59 60 Debug("main thread return\n") 61 62 return reposBuff, errChan 63 } 64 65 func (r *Repo) Print(repos []github.Repository) (bool, int) { 66 Debug("repos length %d\n", len(repos)) 67 repoNameMaxLen := 0 68 for _, repo := range repos { 69 repoNamelen := len(*repo.FullName) 70 if repoNamelen > repoNameMaxLen { 71 repoNameMaxLen = repoNamelen 72 } 73 } 74 printLine := func(repo *github.Repository) { 75 if repo.FullName != nil { 76 Printf("%v", *repo.FullName) 77 } 78 Printf(" ") 79 paddingLen := repoNameMaxLen - len(*repo.FullName) 80 for i := 0; i < paddingLen; i++ { 81 Printf(" ") 82 } 83 if repo.Description != nil { 84 Printf("%v", *repo.Description) 85 } 86 Printf("\n") 87 } 88 for _, repo := range repos { 89 printLine(&repo) 90 r.printCount++ 91 Debug("printCount %d, r.maxItem %d\n", r.printCount, r.maxItem) 92 if r.printCount >= r.maxItem { 93 return true, r.printCount 94 } 95 } 96 return false, r.printCount 97 }