Skip to content

Commit

Permalink
Add SetReadme method in git module.
Browse files Browse the repository at this point in the history
  • Loading branch information
gjbae1212 committed Feb 15, 2020
1 parent afb9228 commit 3cc64d2
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 4 deletions.
3 changes: 2 additions & 1 deletion git/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var (

type Git interface {
User() (*User, error)
SetReadme(starred []*Starred)
ListStarredAll() ([]*Starred, error)
ListReadme(owners []string, repos []string) ([]*Readme, error)
}
Expand All @@ -32,5 +33,5 @@ func NewGit(token string) (Git, error) {
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
client := github.NewClient(oauth2.NewClient(context.Background(), ts))

return &wrapper{Client: client}, nil
return &wrapper{Client: client, token: token}, nil
}
68 changes: 66 additions & 2 deletions git/wrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ type Starred struct {
CreatedAt JsonTime `json:"created_at,omitempty"`
UpdateAt JsonTime `json:"updated_at,omitempty"`
PushedAt JsonTime `json:"pushed_at,omitempty"`
Readme string `json:"readme,omitempty"`
Error error `json:"-"`
}

type User struct {
Expand All @@ -47,6 +49,8 @@ type User struct {
Bio string `json:"bio,omitempty"`
CreatedAt JsonTime `json:"created_at,omitempty"`
UpdatedAt JsonTime `json:"updated_at,omitempty"`
Token string `json:"token"`
CachedAt JsonTime `json:"cached_at"`
}

type JsonTime struct {
Expand Down Expand Up @@ -76,6 +80,7 @@ func (jt *JsonTime) UnmarshalJSON(bys []byte) error {

type wrapper struct {
*github.Client
token string
}

// User returns github user object.
Expand All @@ -96,6 +101,8 @@ func (w *wrapper) User() (*User, error) {
Bio: user.GetBio(),
CreatedAt: JsonTime{user.GetCreatedAt().Time},
UpdatedAt: JsonTime{user.GetUpdatedAt().Time},
CachedAt: JsonTime{time.Now()},
Token: w.token,
}, nil
case errors.As(err, &githubRateLimit):
return nil, fmt.Errorf("[err] NewGit %w", ErrApiQuotaExceed)
Expand Down Expand Up @@ -143,6 +150,43 @@ func (w *wrapper) ListStarredAll() ([]*Starred, error) {
return starred, nil
}

// SetReadme sets readme to starred.
func (w *wrapper) SetReadme(starred []*Starred) {
if len(starred) == 0 {
return
}

total := len(starred)
queueSize := total/parallelSize + parallelSize

wg := sync.WaitGroup{}
var multiQueue []chan *Starred

for i := 0; i < parallelSize; i++ {
wg.Add(1)
ch := make(chan *Starred, queueSize)
multiQueue = append(multiQueue, ch)
go func(queue chan *Starred) {
for r := range queue {
w.setReadmeToStarred(r)
}
wg.Done()
}(ch)
}

// distributes items
for i, star := range starred {
hole := i % parallelSize
multiQueue[hole] <- star
}

// close channel
for _, ch := range multiQueue {
close(ch)
}
wg.Wait()
}

// ListReadme returns readme list.
func (w *wrapper) ListReadme(owners []string, repos []string) ([]*Readme, error) {
if len(owners) == 0 || len(repos) == 0 || len(owners) != len(repos) {
Expand Down Expand Up @@ -191,17 +235,37 @@ func (w *wrapper) getReadme(owner, repo string) (string, error) {

readme, _, err := w.Repositories.GetReadme(ctx, owner, repo, nil)
if err != nil {
return "", fmt.Errorf("[err] GetReadme %w", err)
return "", fmt.Errorf("[err] getReadme %w", err)
}

content, err := readme.GetContent()
if err != nil {
return "", fmt.Errorf("[err] GetReadme %w", err)
return "", fmt.Errorf("[err] getReadme %w", err)
}

return content, nil
}

func (w *wrapper) setReadmeToStarred(s *Starred) {
ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
defer cancel()

readme, _, err := w.Repositories.GetReadme(ctx, s.Owner, s.Repo, nil)
if err != nil {
s.Error = fmt.Errorf("[err] setReadmeToStarred %w", err)
return
}

content, err := readme.GetContent()
if err != nil {
s.Error = fmt.Errorf("[err] setReadmeToStarred %w", err)
return
}

s.Readme = content
return
}

func (w *wrapper) listStarredPaging(page, perPage int) ([]*github.StarredRepository, *github.Response, error) {
ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
defer cancel()
Expand Down
36 changes: 35 additions & 1 deletion git/wrapper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ func TestWrapper_ListStarredAll(t *testing.T) {
}
}

func TestWrapper_GetMultiReadme(t *testing.T) {
func TestWrapper_ListReadme(t *testing.T) {
assert := assert.New(t)

g, err := NewGit(os.Getenv("GITHUB_TOKEN"))
Expand Down Expand Up @@ -233,3 +233,37 @@ func TestWrapper_GetMultiReadme(t *testing.T) {
}
}
}

func TestWrapper_SetReadme(t *testing.T) {
assert := assert.New(t)

g, err := NewGit(os.Getenv("GITHUB_TOKEN"))
assert.NoError(err)

starred, err := g.ListStarredAll()
assert.NoError(err)

tests := map[string]struct {
starred []*Starred
size int
isErr bool
}{
"fail": {isErr: true},
"success": {starred: starred, size: len(starred)},
}

for _, t := range tests {
g.SetReadme(t.starred)
fail := 0
success := 0
for _, star := range t.starred {
if star.Error != nil {
fail++
} else if star.Readme != "" {
success++
}
}
assert.Equal(fail+success, t.size)
color.Blue("Readme success %d, Readme error %d", success, fail)
}
}

0 comments on commit 3cc64d2

Please sign in to comment.