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  }