/
issue.go
95 lines (74 loc) · 2.1 KB
/
issue.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package shallow
import (
"context"
"database/sql"
"fmt"
"github.com/src-d/ghsync/models"
"github.com/google/go-github/github"
"gopkg.in/src-d/go-kallax.v1"
"gopkg.in/src-d/go-log.v1"
)
type IssueSyncer struct {
db *sql.DB
client *github.Client
}
func NewIssueSyncer(db *sql.DB, c *github.Client) *IssueSyncer {
return &IssueSyncer{
db: db,
client: c,
}
}
func (s *IssueSyncer) Sync(owner, repo string, logger log.Logger) error {
store := models.NewIssueStore(s.db)
return store.Transaction(func(store *models.IssueStore) error {
return s.doIssues(store, owner, repo, logger)
})
}
func (s *IssueSyncer) doIssues(store *models.IssueStore, owner, repo string, logger log.Logger) error {
opts := &github.IssueListByRepoOptions{}
opts.ListOptions.PerPage = listOptionsPerPage
opts.State = "all"
logger.Infof("starting to retrieve issues")
// Get the list of all issues
for {
issues, r, err := s.client.Issues.ListByRepo(context.TODO(), owner, repo, opts)
if err != nil {
return err
}
for _, i := range issues {
if i.IsPullRequest() {
continue
}
logger := logger.With(log.Fields{"issue": i.GetNumber()})
_, err := store.FindOne(models.NewIssueQuery().
Where(kallax.And(
kallax.Eq(models.Schema.Issue.RepositoryOwner, owner),
kallax.Eq(models.Schema.Issue.RepositoryName, repo),
kallax.Eq(models.Schema.Issue.Number, i.GetNumber()),
)),
)
if err != nil && err != kallax.ErrNotFound {
logger.Errorf(err, "failed to read the resource from the DB")
return fmt.Errorf("failed to read the resource from the DB: %v", err)
}
if err == nil {
logger.Infof("resource already exists, skipping")
continue
}
record := models.NewIssue()
record.Issue = *i
err = store.Insert(record)
if err != nil {
logger.Errorf(err, "failed to write the resource into the DB")
return fmt.Errorf("failed to write the resource into the DB: %v", err)
}
logger.Debugf("resource written in the DB")
}
if r.NextPage == 0 {
break
}
opts.Page = r.NextPage
}
logger.Infof("finished to retrieve issues")
return nil
}