maintner: extend GitHubIssue to track Code Review Events

Previously, maintner would track only the Events
on an Issue/PullRequest, which missed out on the
discussions and approvals that the review
process generates.

This adds a new struct GitHubReviewEvent to represent
the results from the GitHub "pulls/reviews" API. This
struct follows the same pattern as the GitHubIssueEvent
struct.

To accomplish this, a new call has been added to the
sync() function: syncReviews, which follows the
pattern established with syncEvents().

Finally, this adds an additonal method: ForeachReview which
iterates over the GitHubReviewEvents in
the given GitHubIssue serially and in
chronological order.

GitHub API Reference: https://developer.github.com/v3/pulls/reviews/

Updates golang/go#21086

Change-Id: I4f59e154a4e4a8a4b8f2676dea932cf44354c288
Reviewed-on: https://go-review.googlesource.com/c/144699
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Colin Nelson 2018-10-25 15:12:44 -07:00 коммит произвёл Brad Fitzpatrick
Родитель 1e1239bc6c
Коммит 36a2830f67
4 изменённых файлов: 790 добавлений и 100 удалений

Просмотреть файл

@ -164,6 +164,32 @@ func (gr *GitHubRepo) ForeachIssue(fn func(*GitHubIssue) error) error {
return nil
}
// ForeachReview calls fn for each review event on the issue
//
// If the issue is not a PullRequest, then it returns early with no error.
//
// If fn returns an error, iteration ends and ForeachReview returns
// with that error.
//
// The fn function is called serially, in chronological order.
func (pr *GitHubIssue) ForeachReview(fn func(*GitHubReview) error) error {
if !pr.PullRequest {
return nil
}
s := make([]*GitHubReview, 0, len(pr.reviews))
for _, rv := range pr.reviews {
s = append(s, rv)
}
sort.Slice(s, func(i, j int) bool { return s[i].Created.Before(s[j].Created) })
for _, rv := range s {
if err := fn(rv); err != nil {
return err
}
}
return nil
}
func (g *GitHubRepo) getOrCreateMilestone(id int64) *GitHubMilestone {
if id == 0 {
panic("zero id")
@ -251,7 +277,9 @@ type GitHubIssue struct {
comments map[int64]*GitHubComment // by comment.ID
eventMaxTime time.Time // latest time of any event in events map
eventsSyncedAsOf time.Time // as of server's Date header
reviewsSyncedAsOf time.Time // as of server's Date header
events map[int64]*GitHubIssueEvent // by event.ID
reviews map[int64]*GitHubReview // by event.ID
}
// LastModified reports the most recent time that any known metadata was updated.
@ -467,6 +495,68 @@ func (ms *GitHubMilestone) processMutation(mut maintpb.GithubMilestone) {
}
}
// GitHubReview represents a review on a Pull Request.
// For more details, see https://developer.github.com/v3/pulls/reviews/
type GitHubReview struct {
ID int64
Actor *GitHubUser
Body string
State string // COMMENTED, APPROVED, CHANGES_REQUESTED
CommitID string
ActorAssociation string // CONTRIBUTOR
Created time.Time
OtherJSON string
}
// Proto converts GitHubReview to a protobuf
func (e *GitHubReview) Proto() *maintpb.GithubReview {
p := &maintpb.GithubReview{
Id: e.ID,
Body: e.Body,
State: e.State,
CommitId: e.CommitID,
ActorAssociation: e.ActorAssociation,
}
if e.OtherJSON != "" {
p.OtherJson = []byte(e.OtherJSON)
}
if !e.Created.IsZero() {
if tp, err := ptypes.TimestampProto(e.Created); err == nil {
p.Created = tp
}
}
if e.Actor != nil {
p.ActorId = e.Actor.ID
}
return p
}
// r.github.c.mu must be held.
func (r *GitHubRepo) newGithubReview(p *maintpb.GithubReview) *GitHubReview {
g := r.github
e := &GitHubReview{
ID: p.Id,
Actor: g.getOrCreateUserID(p.ActorId),
ActorAssociation: p.ActorAssociation,
CommitID: p.CommitId,
Body: p.Body,
State: p.State,
}
if p.Created != nil {
e.Created, _ = ptypes.Timestamp(p.Created)
}
if len(p.OtherJson) > 0 {
// TODO: parse it and see if we've since learned how
// to deal with it?
log.Printf("Unknown JSON in log: %s", p.OtherJson)
e.OtherJSON = string(p.OtherJson)
}
return e
}
type GitHubComment struct {
ID int64
User *GitHubUser
@ -657,6 +747,16 @@ func (gi *GitHubIssue) eventsSynced() bool {
return gi.eventsSyncedAsOf.After(gi.Updated)
}
// (requires corpus be locked for reads)
func (gi *GitHubIssue) reviewsSynced() bool {
if gi.NotExist {
// Issue doesn't exist, so can't sync its non-issues,
// so consider it done.
return true
}
return gi.reviewsSyncedAsOf.After(gi.Updated)
}
func (c *Corpus) initGithub() {
if c.github != nil {
return
@ -1312,6 +1412,26 @@ func (c *Corpus) processGithubIssueMutation(m *maintpb.GithubIssueMutation) {
gi.eventsSyncedAsOf = serverDate.UTC()
}
}
for _, rmut := range m.Review {
if rmut.Id == 0 {
log.Printf("Ignoring bogus review mutation lacking Id: %v", rmut)
continue
}
if gi.reviews == nil {
gi.reviews = make(map[int64]*GitHubReview)
}
gre := gr.newGithubReview(rmut)
gi.reviews[rmut.Id] = gre
if gre.Created.After(gi.eventMaxTime) {
gi.eventMaxTime = gre.Created
}
}
if m.ReviewStatus != nil && m.ReviewStatus.ServerDate != nil {
if serverDate, err := ptypes.Timestamp(m.ReviewStatus.ServerDate); err == nil {
gi.reviewsSyncedAsOf = serverDate.UTC()
}
}
}
// githubCache is an httpcache.Cache wrapper that only
@ -1454,6 +1574,9 @@ func (p *githubRepoPoller) sync(ctx context.Context, expectChanges bool) error {
if err := p.syncEvents(ctx); err != nil {
return err
}
if err := p.syncReviews(ctx); err != nil {
return err
}
return nil
}
@ -2099,6 +2222,210 @@ func parseGithubEvents(r io.Reader) ([]*GitHubIssueEvent, error) {
return evts, nil
}
func (p *githubRepoPoller) issueNumbersWithStaleReviewsSync() (issueNums []int32) {
p.c.mu.RLock()
defer p.c.mu.RUnlock()
for n, gi := range p.gr.issues {
if gi.PullRequest && !gi.reviewsSynced() {
issueNums = append(issueNums, n)
}
}
sort.Slice(issueNums, func(i, j int) bool {
return issueNums[i] < issueNums[j]
})
return issueNums
}
func (p *githubRepoPoller) syncReviews(ctx context.Context) error {
for {
nums := p.issueNumbersWithStaleReviewsSync()
if len(nums) == 0 {
return nil
}
remain := len(nums)
for _, num := range nums {
p.logf("reviews sync: %d issues remaining; syncing issue %v", remain, num)
if err := p.syncReviewsOnPullRequest(ctx, num); err != nil {
p.logf("review sync on issue %d: %v", num, err)
return err
}
remain--
}
}
}
func (p *githubRepoPoller) syncReviewsOnPullRequest(ctx context.Context, issueNum int32) error {
const perPage = 100
p.c.mu.RLock()
gi := p.gr.issues[issueNum]
if gi == nil {
p.c.mu.RUnlock()
panic(fmt.Sprintf("bogus issue %v", issueNum))
}
if !gi.PullRequest {
p.c.mu.RUnlock()
return nil
}
have := len(gi.reviews)
p.c.mu.RUnlock()
skipPages := have / perPage
mut := &maintpb.Mutation{
GithubIssue: &maintpb.GithubIssueMutation{
Owner: p.Owner(),
Repo: p.Repo(),
Number: issueNum,
},
}
err := p.foreachItem(ctx,
1+skipPages,
func(ctx context.Context, page int) ([]interface{}, *github.Response, error) {
u := fmt.Sprintf("https://api.github.com/repos/%s/%s/pulls/%v/reviews?per_page=%v&page=%v",
p.Owner(), p.Repo(), issueNum, perPage, page)
req, _ := http.NewRequest("GET", u, nil)
req.Header.Set("Authorization", "Bearer "+p.token)
req.Header.Set("User-Agent", "golang-x-build-maintner/1.0")
ctx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()
req = req.WithContext(ctx)
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Printf("Fetching %s: %v", u, err)
return nil, nil, err
}
log.Printf("Fetching %s: %v", u, res.Status)
if res.StatusCode != http.StatusOK {
log.Printf("Fetching %s: %v: %+v", u, res.Status, res.Header)
// TODO: rate limiting, etc.
return nil, nil, fmt.Errorf("%s: %v", u, res.Status)
}
evts, err := parseGithubReviews(res.Body)
if err != nil {
return nil, nil, fmt.Errorf("%s: parse github pr review events: %v", u, err)
}
is := make([]interface{}, len(evts))
for i, v := range evts {
is[i] = v
}
serverDate, err := http.ParseTime(res.Header.Get("Date"))
if err != nil {
return nil, nil, fmt.Errorf("invalid server Date response: %v", err)
}
sdp, _ := ptypes.TimestampProto(serverDate.UTC())
mut.GithubIssue.ReviewStatus = &maintpb.GithubIssueSyncStatus{ServerDate: sdp}
return is, makeGithubResponse(res), err
},
func(v interface{}) error {
ge := v.(*GitHubReview)
p.c.mu.RLock()
_, ok := gi.reviews[ge.ID]
p.c.mu.RUnlock()
if ok {
// Already have it. And they're
// assumed to be immutable, so the
// copy we already have should be
// good. Don't add to mutation log.
return nil
}
mut.GithubIssue.Review = append(mut.GithubIssue.Review, ge.Proto())
return nil
})
if err != nil {
return err
}
p.c.addMutation(mut)
return nil
}
// parseGithubReviews parses the JSON array of GitHub review events in r. It
// does this the very manual way (using map[string]interface{})
// instead of using nice types because https://golang.org/issue/15314
// isn't implemented yet and also because even if it were implemented,
// this code still wants to preserve any unknown fields to store in
// the "OtherJSON" field for future updates of the code to parse. (If
// GitHub adds new Event types in the future, we want to archive them,
// even if we don't understand them)
func parseGithubReviews(r io.Reader) ([]*GitHubReview, error) {
var jevents []map[string]interface{}
jd := json.NewDecoder(r)
jd.UseNumber()
if err := jd.Decode(&jevents); err != nil {
return nil, err
}
var evts []*GitHubReview
for _, em := range jevents {
for k, v := range em {
if v == nil {
delete(em, k)
}
}
e := &GitHubReview{}
e.ID = jint64(em["id"])
delete(em, "id")
e.Body, _ = em["body"].(string)
delete(em, "body")
e.State, _ = em["state"].(string)
delete(em, "state")
// TODO: store these two more compactly:
e.CommitID, _ = em["commit_id"].(string) // "5383ecf5a0824649ffcc0349f00f0317575753d0"
delete(em, "commit_id")
getUser := func(field string, gup **GitHubUser) {
am, ok := em[field].(map[string]interface{})
if !ok {
return
}
delete(em, field)
gu := &GitHubUser{ID: jint64(am["id"])}
gu.Login, _ = am["login"].(string)
*gup = gu
}
getUser("user", &e.Actor)
e.ActorAssociation, _ = em["author_association"].(string)
delete(em, "author_association")
if createdStr, ok := em["submitted_at"].(string); ok {
delete(em, "submitted_at")
var err error
e.Created, err = time.Parse(time.RFC3339, createdStr)
if err != nil {
return nil, err
}
e.Created = e.Created.UTC()
}
delete(em, "node_id") // not sure what it is, but don't need to store it
delete(em, "html_url") // not needed.
delete(em, "pull_request_url") // not needed.
delete(em, "_links") // not needed. (duplicate data of above two nodes)
otherJSON, _ := json.Marshal(em)
e.OtherJSON = string(otherJSON)
if e.OtherJSON == "{}" {
e.OtherJSON = ""
}
if e.OtherJSON != "" {
log.Printf("warning: storing unknown field(s) in GitHub event: %s", e.OtherJSON)
}
evts = append(evts, e)
}
return evts, nil
}
// jint64 return an int64 from the provided JSON object value v.
func jint64(v interface{}) int64 {
switch v := v.(type) {

Просмотреть файл

@ -5,6 +5,7 @@
package maintner
import (
"fmt"
"reflect"
"strings"
"testing"
@ -516,6 +517,240 @@ func TestParseGithubEvents(t *testing.T) {
t.Logf("Tested event types: %q", eventTypes)
}
func TestParseGitHubReviews(t *testing.T) {
tests := []struct {
name string // test
j string // JSON from Github API
e *GitHubReview // in-memory
p *maintpb.GithubReview // on disk
}{
{
name: "Approved",
j: `{
"id": 123456,
"node_id": "548913adsafas84asdf48a",
"user": {
"login": "bradfitz",
"id": 2621
},
"body": "I approve this commit",
"state": "APPROVED",
"html_url": "https://github.com/bradfitz/go-issue-mirror/pull/21",
"pull_request_url": "https://github.com/bradfitz/go-issue-mirror/pull/21",
"author_association": "CONTRIBUTOR",
"_links":{
"html":{
"href": "https://github.com/bradfitz/go-issue-mirror/pull/21"
},
"pull_request":{
"href": "https://github.com/bradfitz/go-issue-mirror/pull/21"
}
},
"submitted_at": "2018-03-22T00:26:48Z",
"commit_id" : "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126"
}`,
e: &GitHubReview{
ID: 123456,
Actor: &GitHubUser{
ID: 2621,
Login: "bradfitz",
},
Body: "I approve this commit",
State: "APPROVED",
CommitID: "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126",
ActorAssociation: "CONTRIBUTOR",
Created: t3339("2018-03-22T00:26:48Z"),
},
p: &maintpb.GithubReview{
Id: 123456,
ActorId: 2621,
Body: "I approve this commit",
State: "APPROVED",
CommitId: "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126",
ActorAssociation: "CONTRIBUTOR",
Created: p3339("2018-03-22T00:26:48Z"),
},
},
{
name: "Extra Unknown JSON",
j: `{
"id": 123456,
"node_id": "548913adsafas84asdf48a",
"user": {
"login": "bradfitz",
"id": 2621
},
"body": "I approve this commit",
"state": "APPROVED",
"html_url": "https://github.com/bradfitz/go-issue-mirror/pull/21",
"pull_request_url": "https://github.com/bradfitz/go-issue-mirror/pull/21",
"author_association": "CONTRIBUTOR",
"_links":{
"html":{
"href": "https://github.com/bradfitz/go-issue-mirror/pull/21"
},
"pull_request":{
"href": "https://github.com/bradfitz/go-issue-mirror/pull/21"
}
},
"submitted_at": "2018-03-22T00:26:48Z",
"commit_id" : "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126",
"random_key": "some random value"
}`,
e: &GitHubReview{
ID: 123456,
Actor: &GitHubUser{
ID: 2621,
Login: "bradfitz",
},
Body: "I approve this commit",
State: "APPROVED",
CommitID: "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126",
ActorAssociation: "CONTRIBUTOR",
Created: t3339("2018-03-22T00:26:48Z"),
OtherJSON: `{"random_key":"some random value"}`,
},
p: &maintpb.GithubReview{
Id: 123456,
ActorId: 2621,
Body: "I approve this commit",
State: "APPROVED",
CommitId: "e4d70f7e8892f024e4ed3e8b99ee6c5a9f16e126",
ActorAssociation: "CONTRIBUTOR",
Created: p3339("2018-03-22T00:26:48Z"),
OtherJson: []byte(`{"random_key":"some random value"}`),
},
},
}
for _, tt := range tests {
evts, err := parseGithubReviews(strings.NewReader("[" + tt.j + "]"))
if err != nil {
t.Errorf("%s: parse JSON: %v", tt.name, err)
continue
}
if len(evts) != 1 {
t.Errorf("%s: parse JSON = %v entries; want 1", tt.name, len(evts))
continue
}
gote := evts[0]
if !reflect.DeepEqual(gote, tt.e) {
t.Errorf("%s: JSON -> githubReviewEvent differs: %v", tt.name, DeepDiff(gote, tt.e))
continue
}
gotp := gote.Proto()
if !reflect.DeepEqual(gotp, tt.p) {
t.Errorf("%s: githubReviewEvent -> proto differs: %v", tt.name, DeepDiff(gotp, tt.p))
continue
}
var c Corpus
c.initGithub()
c.github.getOrCreateUserID(2621).Login = "bradfitz"
c.github.getOrCreateUserID(1924134).Login = "dmitshur"
gr := c.github.getOrCreateRepo("foowner", "bar")
e2 := gr.newGithubReview(gotp)
if !reflect.DeepEqual(e2, tt.e) {
t.Errorf("%s: proto -> githubReviewEvent differs: %v", tt.name, DeepDiff(e2, tt.e))
continue
}
}
}
func TestForeachRepo(t *testing.T) {
tests := []struct {
name string
issue *GitHubIssue
want []string
wantErr error
}{
{
name: "Skips non-PullRequests",
issue: &GitHubIssue{
PullRequest: false,
},
want: []string{},
wantErr: nil,
},
{
name: "Processes Multiple in Order",
issue: &GitHubIssue{
PullRequest: true,
reviews: map[int64]*GitHubReview{
0: &GitHubReview{
Body: "Second",
Created: t3339("2018-04-22T00:26:48Z"),
},
1: &GitHubReview{
Body: "First",
Created: t3339("2018-03-22T00:26:48Z"),
},
},
},
want: []string{"First", "Second"},
wantErr: nil,
},
{
name: "Will Error",
issue: &GitHubIssue{
PullRequest: true,
reviews: map[int64]*GitHubReview{
0: &GitHubReview{
Body: "Fail",
},
},
},
want: []string{},
wantErr: fmt.Errorf("Planned Failure"),
},
{
name: "Will Error Late",
issue: &GitHubIssue{
PullRequest: true,
reviews: map[int64]*GitHubReview{
0: &GitHubReview{
Body: "First Event",
Created: t3339("2018-03-22T00:26:48Z"),
},
1: &GitHubReview{
Body: "Fail",
Created: t3339("2018-04-22T00:26:48Z"),
},
2: &GitHubReview{
Body: "Third Event",
Created: t3339("2018-05-22T00:26:48Z"),
},
},
},
want: []string{"First Event"},
wantErr: fmt.Errorf("Planned Failure"),
}}
for _, tt := range tests {
got := make([]string, 0)
err := tt.issue.ForeachReview(func(r *GitHubReview) error {
if r.Body == "Fail" {
return fmt.Errorf("Planned Failure")
}
got = append(got, r.Body)
return nil
})
if !reflect.DeepEqual(tt.wantErr, err) {
t.Errorf("%s: ForeachReview errs differ. got: %s, want: %s", tt.name, err, tt.wantErr)
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("%s: ForeachReview calls differ. got: %s want: %s", tt.name, got, tt.want)
}
}
t.Log("Tested Reviews")
}
func TestCacheableURL(t *testing.T) {
tests := []struct {
v string

Просмотреть файл

@ -17,6 +17,7 @@ It has these top-level messages:
GithubIssueEvent
GithubDismissedReviewEvent
GithubCommit
GithubReview
GithubIssueSyncStatus
GithubIssueCommentMutation
GithubUser
@ -164,6 +165,8 @@ type GithubIssueMutation struct {
CommentStatus *GithubIssueSyncStatus `protobuf:"bytes,14,opt,name=comment_status,json=commentStatus" json:"comment_status,omitempty"`
Event []*GithubIssueEvent `protobuf:"bytes,26,rep,name=event" json:"event,omitempty"`
EventStatus *GithubIssueSyncStatus `protobuf:"bytes,27,opt,name=event_status,json=eventStatus" json:"event_status,omitempty"`
Review []*GithubReview `protobuf:"bytes,29,rep,name=review" json:"review,omitempty"`
ReviewStatus *GithubIssueSyncStatus `protobuf:"bytes,30,opt,name=review_status,json=reviewStatus" json:"review_status,omitempty"`
}
func (m *GithubIssueMutation) Reset() { *m = GithubIssueMutation{} }
@ -360,6 +363,20 @@ func (m *GithubIssueMutation) GetEventStatus() *GithubIssueSyncStatus {
return nil
}
func (m *GithubIssueMutation) GetReview() []*GithubReview {
if m != nil {
return m.Review
}
return nil
}
func (m *GithubIssueMutation) GetReviewStatus() *GithubIssueSyncStatus {
if m != nil {
return m.ReviewStatus
}
return nil
}
// BoolChange represents a change to a boolean value.
type BoolChange struct {
Val bool `protobuf:"varint,1,opt,name=val" json:"val,omitempty"`
@ -666,6 +683,84 @@ func (m *GithubCommit) GetCommitId() string {
return ""
}
// Contents of a pull request review - when someone
// comments, requests changes, or approves changes
// on a pull request. See
// https://developer.github.com/v3/pulls/reviews/ for more information.
type GithubReview struct {
// Required:
Id int64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
ActorId int64 `protobuf:"varint,2,opt,name=actor_id,json=actorId" json:"actor_id,omitempty"`
Created *google_protobuf.Timestamp `protobuf:"bytes,3,opt,name=created" json:"created,omitempty"`
Body string `protobuf:"bytes,4,opt,name=body" json:"body,omitempty"`
State string `protobuf:"bytes,5,opt,name=state" json:"state,omitempty"`
CommitId string `protobuf:"bytes,6,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
ActorAssociation string `protobuf:"bytes,7,opt,name=actor_association,json=actorAssociation" json:"actor_association,omitempty"`
// other_json is usually empty.
OtherJson []byte `protobuf:"bytes,8,opt,name=other_json,json=otherJson,proto3" json:"other_json,omitempty"`
}
func (m *GithubReview) Reset() { *m = GithubReview{} }
func (m *GithubReview) String() string { return proto.CompactTextString(m) }
func (*GithubReview) ProtoMessage() {}
func (*GithubReview) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *GithubReview) GetId() int64 {
if m != nil {
return m.Id
}
return 0
}
func (m *GithubReview) GetActorId() int64 {
if m != nil {
return m.ActorId
}
return 0
}
func (m *GithubReview) GetCreated() *google_protobuf.Timestamp {
if m != nil {
return m.Created
}
return nil
}
func (m *GithubReview) GetBody() string {
if m != nil {
return m.Body
}
return ""
}
func (m *GithubReview) GetState() string {
if m != nil {
return m.State
}
return ""
}
func (m *GithubReview) GetCommitId() string {
if m != nil {
return m.CommitId
}
return ""
}
func (m *GithubReview) GetActorAssociation() string {
if m != nil {
return m.ActorAssociation
}
return ""
}
func (m *GithubReview) GetOtherJson() []byte {
if m != nil {
return m.OtherJson
}
return nil
}
// GithubIssueSyncStatus notes where syncing is at for comments
// on an issue,
// This mutation type is only made at/after the same top-level mutation
@ -679,7 +774,7 @@ type GithubIssueSyncStatus struct {
func (m *GithubIssueSyncStatus) Reset() { *m = GithubIssueSyncStatus{} }
func (m *GithubIssueSyncStatus) String() string { return proto.CompactTextString(m) }
func (*GithubIssueSyncStatus) ProtoMessage() {}
func (*GithubIssueSyncStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*GithubIssueSyncStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *GithubIssueSyncStatus) GetServerDate() *google_protobuf.Timestamp {
if m != nil {
@ -699,7 +794,7 @@ type GithubIssueCommentMutation struct {
func (m *GithubIssueCommentMutation) Reset() { *m = GithubIssueCommentMutation{} }
func (m *GithubIssueCommentMutation) String() string { return proto.CompactTextString(m) }
func (*GithubIssueCommentMutation) ProtoMessage() {}
func (*GithubIssueCommentMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (*GithubIssueCommentMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *GithubIssueCommentMutation) GetId() int64 {
if m != nil {
@ -744,7 +839,7 @@ type GithubUser struct {
func (m *GithubUser) Reset() { *m = GithubUser{} }
func (m *GithubUser) String() string { return proto.CompactTextString(m) }
func (*GithubUser) ProtoMessage() {}
func (*GithubUser) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (*GithubUser) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *GithubUser) GetId() int64 {
if m != nil {
@ -768,7 +863,7 @@ type GithubTeam struct {
func (m *GithubTeam) Reset() { *m = GithubTeam{} }
func (m *GithubTeam) String() string { return proto.CompactTextString(m) }
func (*GithubTeam) ProtoMessage() {}
func (*GithubTeam) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*GithubTeam) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *GithubTeam) GetId() int64 {
if m != nil {
@ -794,7 +889,7 @@ type GitMutation struct {
func (m *GitMutation) Reset() { *m = GitMutation{} }
func (m *GitMutation) String() string { return proto.CompactTextString(m) }
func (*GitMutation) ProtoMessage() {}
func (*GitMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*GitMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *GitMutation) GetRepo() *GitRepo {
if m != nil {
@ -819,7 +914,7 @@ type GitRepo struct {
func (m *GitRepo) Reset() { *m = GitRepo{} }
func (m *GitRepo) String() string { return proto.CompactTextString(m) }
func (*GitRepo) ProtoMessage() {}
func (*GitRepo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*GitRepo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *GitRepo) GetGoRepo() string {
if m != nil {
@ -838,7 +933,7 @@ type GitCommit struct {
func (m *GitCommit) Reset() { *m = GitCommit{} }
func (m *GitCommit) String() string { return proto.CompactTextString(m) }
func (*GitCommit) ProtoMessage() {}
func (*GitCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*GitCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *GitCommit) GetSha1() string {
if m != nil {
@ -869,7 +964,7 @@ type GitDiffTree struct {
func (m *GitDiffTree) Reset() { *m = GitDiffTree{} }
func (m *GitDiffTree) String() string { return proto.CompactTextString(m) }
func (*GitDiffTree) ProtoMessage() {}
func (*GitDiffTree) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*GitDiffTree) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *GitDiffTree) GetFile() []*GitDiffTreeFile {
if m != nil {
@ -889,7 +984,7 @@ type GitDiffTreeFile struct {
func (m *GitDiffTreeFile) Reset() { *m = GitDiffTreeFile{} }
func (m *GitDiffTreeFile) String() string { return proto.CompactTextString(m) }
func (*GitDiffTreeFile) ProtoMessage() {}
func (*GitDiffTreeFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*GitDiffTreeFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *GitDiffTreeFile) GetFile() string {
if m != nil {
@ -932,7 +1027,7 @@ type GerritMutation struct {
func (m *GerritMutation) Reset() { *m = GerritMutation{} }
func (m *GerritMutation) String() string { return proto.CompactTextString(m) }
func (*GerritMutation) ProtoMessage() {}
func (*GerritMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*GerritMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *GerritMutation) GetProject() string {
if m != nil {
@ -970,7 +1065,7 @@ type GitRef struct {
func (m *GitRef) Reset() { *m = GitRef{} }
func (m *GitRef) String() string { return proto.CompactTextString(m) }
func (*GitRef) ProtoMessage() {}
func (*GitRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*GitRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *GitRef) GetRef() string {
if m != nil {
@ -996,6 +1091,7 @@ func init() {
proto.RegisterType((*GithubIssueEvent)(nil), "maintpb.GithubIssueEvent")
proto.RegisterType((*GithubDismissedReviewEvent)(nil), "maintpb.GithubDismissedReviewEvent")
proto.RegisterType((*GithubCommit)(nil), "maintpb.GithubCommit")
proto.RegisterType((*GithubReview)(nil), "maintpb.GithubReview")
proto.RegisterType((*GithubIssueSyncStatus)(nil), "maintpb.GithubIssueSyncStatus")
proto.RegisterType((*GithubIssueCommentMutation)(nil), "maintpb.GithubIssueCommentMutation")
proto.RegisterType((*GithubUser)(nil), "maintpb.GithubUser")
@ -1012,93 +1108,99 @@ func init() {
func init() { proto.RegisterFile("maintner.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1401 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0x86, 0xdf, 0xa5, 0xb3, 0xe3, 0xb8, 0x4c, 0x5f, 0xd8, 0xb4, 0xeb, 0x32, 0x75, 0x58, 0x83,
0xb6, 0x73, 0xda, 0x6e, 0xd8, 0x0a, 0x14, 0xc3, 0xd0, 0xd7, 0xc1, 0xc5, 0xda, 0x0f, 0x6c, 0xfa,
0x59, 0x90, 0x4d, 0x5a, 0x51, 0x27, 0x89, 0x9e, 0x44, 0xa5, 0x0b, 0xb0, 0x7d, 0xd9, 0x1f, 0x19,
0xb0, 0xff, 0xb4, 0xdf, 0xb1, 0xbf, 0x30, 0xf0, 0x48, 0x49, 0x8e, 0xed, 0x34, 0xed, 0xbe, 0xf1,
0x8e, 0xcf, 0x9d, 0x8e, 0x77, 0xc7, 0xe7, 0x28, 0x18, 0x26, 0x41, 0x94, 0xaa, 0x54, 0x64, 0xe3,
0x45, 0x26, 0x95, 0x24, 0x3d, 0x94, 0x17, 0xd3, 0xdd, 0x47, 0x61, 0xa4, 0x8e, 0x8a, 0xe9, 0x78,
0x26, 0x93, 0x83, 0x50, 0xc6, 0x41, 0x1a, 0x1e, 0x20, 0x62, 0x5a, 0xcc, 0x0f, 0x16, 0xea, 0x64,
0x21, 0xf2, 0x03, 0x15, 0x25, 0x22, 0x57, 0x41, 0xb2, 0xa8, 0x57, 0xc6, 0x8b, 0xf7, 0x4f, 0x03,
0x9c, 0x57, 0x85, 0x0a, 0x54, 0x24, 0x53, 0xf2, 0x23, 0x0c, 0x8c, 0x2f, 0x3f, 0xca, 0xf3, 0x42,
0xd0, 0xc6, 0x5e, 0x63, 0xbf, 0xff, 0xe0, 0xfa, 0xd8, 0x7e, 0x69, 0xfc, 0x13, 0x6e, 0x4e, 0xf4,
0x5e, 0x69, 0xc3, 0xfa, 0x61, 0xad, 0x24, 0x07, 0xd0, 0x35, 0x22, 0x6d, 0xa1, 0xe9, 0x95, 0x15,
0xd3, 0xca, 0xca, 0xc2, 0xc8, 0x57, 0xd0, 0x0a, 0x23, 0x45, 0x9b, 0x88, 0xbe, 0xb8, 0x8c, 0xae,
0xa0, 0x1a, 0x80, 0x8e, 0x45, 0x96, 0x45, 0x8a, 0xb6, 0x57, 0x1d, 0xa3, 0x7a, 0xc9, 0x31, 0xca,
0xde, 0xdf, 0x0d, 0x18, 0x9e, 0xfe, 0x26, 0xb9, 0x08, 0x1d, 0xf9, 0x3e, 0x15, 0x19, 0x1e, 0xcb,
0x65, 0x46, 0x20, 0x04, 0xda, 0x99, 0x58, 0x48, 0x0c, 0xc1, 0x65, 0xb8, 0x26, 0x77, 0xa1, 0x1b,
0x07, 0x53, 0x11, 0xe7, 0xb4, 0xb5, 0xd7, 0x5a, 0x0d, 0xec, 0xa8, 0x98, 0xfe, 0xac, 0x37, 0x99,
0xc5, 0x90, 0x87, 0x00, 0x49, 0x14, 0x8b, 0x5c, 0xc9, 0x54, 0xe4, 0xb4, 0x8d, 0x16, 0x74, 0xf5,
0xe0, 0x25, 0x80, 0x2d, 0x61, 0xbd, 0x7f, 0x1d, 0xd8, 0xd9, 0x90, 0xd3, 0x4f, 0x88, 0xf4, 0x32,
0x74, 0xd3, 0x22, 0x99, 0x8a, 0x0c, 0x13, 0xde, 0x61, 0x56, 0x22, 0xd7, 0xc0, 0x4d, 0xa5, 0xf2,
0xc5, 0x6f, 0x51, 0xae, 0xe8, 0xd6, 0x5e, 0x63, 0xdf, 0x61, 0x4e, 0x2a, 0xd5, 0x73, 0x2d, 0x93,
0x21, 0x34, 0x23, 0x4e, 0x07, 0x7b, 0x8d, 0xfd, 0x16, 0x6b, 0x46, 0x9c, 0xdc, 0x82, 0x76, 0x91,
0x8b, 0xcc, 0xa6, 0x76, 0x67, 0x25, 0xf4, 0xb7, 0xb9, 0xc8, 0x18, 0x02, 0xc8, 0x7d, 0x70, 0x83,
0x3c, 0x8f, 0xc2, 0x54, 0x88, 0x9c, 0x02, 0x1e, 0x74, 0x23, 0xba, 0x46, 0x91, 0x3b, 0x70, 0x81,
0x8b, 0x58, 0x28, 0xc1, 0xfd, 0xda, 0xb4, 0xbf, 0xd7, 0xda, 0x6f, 0xb1, 0x91, 0xdd, 0x78, 0x5c,
0x81, 0xbf, 0x85, 0xde, 0x2c, 0x13, 0x81, 0x12, 0x9c, 0x76, 0x30, 0x96, 0xdd, 0x71, 0x28, 0x65,
0x18, 0x8b, 0x71, 0xd9, 0xd0, 0xe3, 0xc3, 0xb2, 0x7f, 0x59, 0x09, 0xd5, 0x56, 0xc5, 0x82, 0xa3,
0x55, 0xf7, 0x7c, 0x2b, 0x0b, 0xd5, 0xd9, 0x9c, 0x4a, 0x7e, 0x42, 0x7b, 0x26, 0x9b, 0x7a, 0xad,
0xf3, 0xae, 0x22, 0x15, 0x0b, 0xea, 0x9a, 0xbc, 0xa3, 0x40, 0xbe, 0x80, 0x41, 0x2a, 0xfd, 0xaa,
0x6c, 0x74, 0x1b, 0xd3, 0xd9, 0x4f, 0x65, 0x55, 0x54, 0x0d, 0xa9, 0xf6, 0xfd, 0x88, 0xd3, 0x11,
0xe6, 0xb6, 0x5f, 0xe9, 0x26, 0x9c, 0xdc, 0x84, 0xad, 0x1a, 0x92, 0x16, 0x09, 0xbd, 0x80, 0x98,
0xda, 0xee, 0x75, 0x91, 0x90, 0x5b, 0xb0, 0x5d, 0x83, 0x4c, 0x28, 0x04, 0x43, 0x19, 0x56, 0xea,
0x43, 0x8c, 0xe9, 0x0e, 0x74, 0x67, 0xb1, 0xcc, 0x05, 0xa7, 0x3b, 0x2b, 0x45, 0x7b, 0x22, 0x65,
0xfc, 0xf4, 0x28, 0x48, 0x43, 0xc1, 0x2c, 0x44, 0x83, 0x63, 0x39, 0xfb, 0x45, 0x70, 0x7a, 0xf5,
0x03, 0x60, 0x03, 0xd1, 0x47, 0x59, 0x14, 0x71, 0xec, 0x67, 0xe2, 0xd7, 0x42, 0xe4, 0x8a, 0x5e,
0x37, 0xa7, 0xd5, 0x3a, 0x66, 0x54, 0xe4, 0x7b, 0x70, 0x8d, 0x67, 0x3f, 0x50, 0xf4, 0xd2, 0xb9,
0x29, 0x77, 0x0c, 0xf8, 0xb1, 0x22, 0xf7, 0x2a, 0xc3, 0xe9, 0x09, 0xbd, 0x7c, 0x76, 0xb7, 0x59,
0x8b, 0x27, 0x27, 0x3a, 0x9a, 0x4c, 0x24, 0xf2, 0x58, 0xf8, 0x78, 0xd9, 0xe8, 0x15, 0xec, 0x9c,
0xbe, 0xd1, 0xe1, 0x35, 0xc4, 0xa6, 0xe4, 0xdc, 0xee, 0xd3, 0x0f, 0xdc, 0x57, 0x27, 0xe0, 0xdc,
0x98, 0xfc, 0x00, 0xbd, 0x99, 0x4c, 0x12, 0x91, 0x2a, 0xea, 0xa0, 0xc1, 0xcd, 0x4d, 0x14, 0xf7,
0xd4, 0x40, 0x2a, 0x6a, 0x29, 0x6d, 0xc8, 0x73, 0x18, 0xda, 0xa5, 0x9f, 0xab, 0x40, 0x15, 0x39,
0x1d, 0xe2, 0x59, 0x6e, 0x6c, 0xf2, 0xf2, 0xe6, 0x24, 0x9d, 0xbd, 0x41, 0x14, 0xdb, 0xb2, 0x56,
0x46, 0x24, 0x07, 0xd0, 0x11, 0xc7, 0x3a, 0x86, 0x5d, 0x8c, 0xe1, 0xea, 0x26, 0xeb, 0xe7, 0x1a,
0xc0, 0x0c, 0x8e, 0x3c, 0x86, 0x01, 0x2e, 0xca, 0xaf, 0x5e, 0xfb, 0xa8, 0xaf, 0xf6, 0xd1, 0xc6,
0x08, 0xde, 0x0d, 0x80, 0xba, 0xe6, 0x64, 0x04, 0xad, 0xe3, 0x20, 0x46, 0x96, 0x71, 0x98, 0x5e,
0x7a, 0xf7, 0xa1, 0xbf, 0x94, 0x32, 0xcb, 0x14, 0x8d, 0x8a, 0x29, 0x08, 0xb4, 0xd3, 0x20, 0x11,
0x25, 0x05, 0xe9, 0xb5, 0xf7, 0x3b, 0x6c, 0xaf, 0x70, 0xdc, 0x9a, 0x59, 0x75, 0xaf, 0x9a, 0xcb,
0xf7, 0xaa, 0xee, 0xe1, 0xd6, 0xf9, 0x3d, 0x5c, 0x13, 0x5d, 0x1b, 0xdd, 0x5a, 0xc9, 0xfb, 0xab,
0x03, 0xa3, 0xd5, 0x7c, 0xad, 0x7d, 0xff, 0x33, 0x00, 0x93, 0x38, 0x3d, 0x0d, 0x6d, 0x10, 0x2e,
0x6a, 0x0e, 0x4f, 0x16, 0x82, 0x5c, 0x05, 0x27, 0x98, 0x29, 0x99, 0xe9, 0x9b, 0xdb, 0x42, 0xa3,
0x1e, 0xca, 0x13, 0xbe, 0xcc, 0x48, 0xed, 0x8f, 0x67, 0xa4, 0xdb, 0xd0, 0x31, 0xed, 0xd8, 0x59,
0x9f, 0x6b, 0x55, 0x3b, 0x1a, 0x08, 0xf9, 0x0e, 0xdc, 0x9a, 0x5a, 0x0c, 0x7f, 0x9d, 0x3d, 0x3c,
0x6a, 0x28, 0xf9, 0x1c, 0xfa, 0x25, 0xa1, 0xea, 0xb8, 0x7b, 0x18, 0x37, 0x94, 0xaa, 0x09, 0x5f,
0x02, 0xe0, 0xc1, 0x9c, 0x53, 0x00, 0x7d, 0xb6, 0xaf, 0xa1, 0xab, 0x1b, 0x32, 0x52, 0x48, 0x77,
0xfd, 0x07, 0x97, 0x56, 0x3e, 0xfb, 0x14, 0x37, 0x99, 0x05, 0x69, 0x7f, 0x99, 0xd0, 0x15, 0xf7,
0xe7, 0x99, 0x4c, 0x68, 0x1f, 0xb3, 0x08, 0x46, 0xf5, 0x22, 0x93, 0x89, 0x9e, 0x39, 0x16, 0xa0,
0x24, 0x4e, 0x17, 0x97, 0x39, 0x46, 0x71, 0x28, 0x8d, 0xf5, 0x71, 0x24, 0xde, 0x9b, 0x68, 0xb6,
0x4c, 0x34, 0xa5, 0x6a, 0xc2, 0xc9, 0x18, 0x76, 0x8c, 0x54, 0x32, 0x8f, 0x01, 0x0e, 0x11, 0x78,
0xc1, 0x6c, 0xb1, 0x72, 0x67, 0xc2, 0xc9, 0x43, 0xd8, 0x52, 0x22, 0x48, 0xfc, 0xd2, 0x05, 0x72,
0xee, 0x3a, 0x9f, 0x1c, 0x8a, 0x20, 0x61, 0x03, 0x8d, 0x64, 0x16, 0x48, 0x5e, 0xc3, 0x88, 0x47,
0x79, 0x12, 0xe5, 0x9a, 0x88, 0x8c, 0x39, 0x72, 0xfa, 0x3a, 0x0d, 0x3c, 0x2b, 0x61, 0xc6, 0xd6,
0x5c, 0xc6, 0x6d, 0x7e, 0x5a, 0xab, 0xbb, 0x4b, 0xaa, 0x23, 0x91, 0xf9, 0xef, 0x72, 0x99, 0x52,
0xd8, 0x6b, 0xec, 0x0f, 0x98, 0x8b, 0x9a, 0x97, 0xb9, 0x4c, 0xbd, 0x3f, 0x1b, 0xb0, 0x7b, 0xb6,
0x3b, 0x93, 0x35, 0x3c, 0x77, 0xd5, 0xb2, 0x8e, 0x51, 0x4c, 0x38, 0x4e, 0x4f, 0x63, 0x14, 0xc4,
0x7e, 0x22, 0xf2, 0x3c, 0x08, 0x05, 0xb6, 0xa8, 0xcb, 0x46, 0xd5, 0xc6, 0x2b, 0xa3, 0xd7, 0xb7,
0x4c, 0x13, 0x83, 0xc0, 0x4e, 0x75, 0x99, 0x11, 0x5e, 0xb6, 0x9d, 0xe6, 0xa8, 0xe5, 0xbd, 0x85,
0xc1, 0x72, 0x51, 0x3f, 0xe1, 0x85, 0x71, 0x0d, 0x5c, 0xd3, 0x00, 0xe5, 0xed, 0x70, 0x99, 0x63,
0x14, 0x13, 0xee, 0x1d, 0xc2, 0xa5, 0x8d, 0xa4, 0x43, 0x1e, 0x41, 0x3f, 0x17, 0xd9, 0xb1, 0xc8,
0x7c, 0x3d, 0x6d, 0xed, 0x43, 0xf2, 0x43, 0x77, 0x07, 0x0c, 0xfc, 0x59, 0xa0, 0x84, 0x7e, 0x93,
0xee, 0x9e, 0xcd, 0xc3, 0x6b, 0xb7, 0xbb, 0x7c, 0xbe, 0x34, 0xcf, 0x7b, 0xbe, 0x94, 0x23, 0xbf,
0xb5, 0x34, 0xf2, 0xff, 0xdf, 0x05, 0x5f, 0x7a, 0x72, 0x74, 0x3e, 0xfa, 0xc9, 0xe1, 0x3d, 0x00,
0xa8, 0x63, 0xda, 0x44, 0x92, 0xb1, 0x0c, 0xa3, 0xb4, 0x24, 0x49, 0x14, 0xbc, 0x7b, 0xa5, 0x8d,
0x6e, 0xe4, 0x4d, 0x7c, 0x9c, 0xc7, 0x45, 0x58, 0x16, 0x4c, 0xaf, 0x3d, 0x1f, 0x29, 0xbc, 0xca,
0xd6, 0x97, 0xb6, 0xa6, 0xa6, 0x04, 0xa3, 0xe5, 0xec, 0x30, 0xb1, 0x90, 0xb6, 0xca, 0xb7, 0x2b,
0x2e, 0x30, 0x59, 0x24, 0xcb, 0xb8, 0xd3, 0x44, 0xe0, 0x79, 0xd0, 0xb3, 0xc6, 0xe4, 0x0a, 0xf4,
0x42, 0xe9, 0x57, 0xfe, 0x5d, 0xd6, 0x0d, 0xa5, 0xde, 0xf0, 0x38, 0xb8, 0x95, 0x21, 0x46, 0x79,
0x14, 0xdc, 0xb7, 0x10, 0x5c, 0xeb, 0xd1, 0x93, 0x05, 0xef, 0xf1, 0x6b, 0x03, 0xa6, 0x97, 0x7a,
0x8e, 0xf3, 0x68, 0x3e, 0xf7, 0x55, 0x26, 0x84, 0x9d, 0x08, 0xa7, 0x88, 0xf3, 0x59, 0x34, 0x9f,
0x1f, 0x66, 0x42, 0x30, 0x87, 0xdb, 0x95, 0xf7, 0x08, 0x8f, 0x5a, 0x6e, 0x90, 0xbb, 0xd0, 0x9e,
0x47, 0xb1, 0xee, 0xb6, 0xb5, 0x27, 0x78, 0x89, 0x79, 0x11, 0xc5, 0x82, 0x21, 0xca, 0x4b, 0x70,
0x6e, 0x2d, 0x6f, 0xe8, 0x40, 0xad, 0x03, 0x0c, 0x54, 0xaf, 0x75, 0x59, 0x02, 0xce, 0x05, 0xc7,
0x50, 0x5b, 0xcc, 0x08, 0x84, 0x42, 0xcf, 0xbe, 0x5e, 0xcb, 0x89, 0x61, 0x45, 0x3d, 0xa8, 0xa6,
0x51, 0x1a, 0x64, 0x27, 0xd8, 0x4f, 0x0e, 0xb3, 0x92, 0xf7, 0x07, 0x0c, 0x4f, 0xff, 0xaa, 0x68,
0x1f, 0x8b, 0x4c, 0xbe, 0x13, 0x33, 0x65, 0x3f, 0x58, 0x8a, 0xe4, 0xae, 0x79, 0x9f, 0x44, 0x2a,
0xa7, 0x4d, 0x3c, 0xcb, 0xa6, 0x72, 0x94, 0x10, 0x72, 0x53, 0x57, 0x78, 0x5e, 0xfe, 0xab, 0x6c,
0x9f, 0xae, 0xf0, 0x9c, 0xe1, 0xa6, 0x37, 0x86, 0xae, 0x91, 0x31, 0xf3, 0x62, 0x6e, 0x3f, 0xa9,
0x97, 0x55, 0x7d, 0x9a, 0x75, 0x7d, 0xa6, 0x5d, 0x6c, 0xe4, 0x6f, 0xfe, 0x0b, 0x00, 0x00, 0xff,
0xff, 0xec, 0x37, 0x4a, 0xa0, 0x76, 0x0e, 0x00, 0x00,
// 1489 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xeb, 0x6e, 0xdb, 0xb6,
0x17, 0x87, 0xef, 0xd2, 0xb1, 0xe3, 0xb8, 0x4c, 0x2f, 0x6c, 0x7a, 0xf9, 0xe7, 0xaf, 0x0e, 0x6b,
0xd0, 0x8b, 0xd3, 0x76, 0xc3, 0x56, 0xa0, 0x18, 0x86, 0x34, 0x6d, 0x07, 0x17, 0x6b, 0x3f, 0xb0,
0xe9, 0x67, 0x41, 0xb6, 0x68, 0x47, 0x9d, 0x24, 0x7a, 0x12, 0x9d, 0x2e, 0xc0, 0xf6, 0xa5, 0x2f,
0x32, 0x60, 0xef, 0xb4, 0x27, 0xd8, 0x8b, 0x0c, 0x3c, 0x24, 0x25, 0xd9, 0x71, 0x9a, 0x74, 0xdf,
0x78, 0xce, 0xf9, 0x1d, 0xf2, 0xf0, 0x5c, 0x49, 0xe8, 0x27, 0x41, 0x94, 0xca, 0x94, 0x67, 0xc3,
0x79, 0x26, 0xa4, 0x20, 0x1d, 0xa4, 0xe7, 0xe3, 0xed, 0x67, 0xb3, 0x48, 0x1e, 0x2d, 0xc6, 0xc3,
0x89, 0x48, 0xf6, 0x66, 0x22, 0x0e, 0xd2, 0xd9, 0x1e, 0x22, 0xc6, 0x8b, 0xe9, 0xde, 0x5c, 0x9e,
0xcc, 0x79, 0xbe, 0x27, 0xa3, 0x84, 0xe7, 0x32, 0x48, 0xe6, 0xe5, 0x4a, 0xef, 0xe2, 0xfd, 0x5d,
0x03, 0xe7, 0xcd, 0x42, 0x06, 0x32, 0x12, 0x29, 0xf9, 0x11, 0x7a, 0x7a, 0x2f, 0x3f, 0xca, 0xf3,
0x05, 0xa7, 0xb5, 0x9d, 0xda, 0x6e, 0xf7, 0xc9, 0xcd, 0xa1, 0x39, 0x69, 0xf8, 0x13, 0x0a, 0x47,
0x4a, 0x66, 0x75, 0x58, 0x77, 0x56, 0x32, 0xc9, 0x1e, 0xb4, 0x35, 0x49, 0x1b, 0xa8, 0x7a, 0x6d,
0x45, 0xb5, 0xd0, 0x32, 0x30, 0xf2, 0x35, 0x34, 0x66, 0x91, 0xa4, 0x75, 0x44, 0x5f, 0xae, 0xa2,
0x0b, 0xa8, 0x02, 0xe0, 0xc6, 0x3c, 0xcb, 0x22, 0x49, 0x9b, 0xab, 0x1b, 0x23, 0xbb, 0xb2, 0x31,
0xd2, 0xde, 0x5f, 0x35, 0xe8, 0x2f, 0x9f, 0x49, 0x2e, 0x43, 0x4b, 0x7c, 0x4c, 0x79, 0x86, 0xd7,
0x72, 0x99, 0x26, 0x08, 0x81, 0x66, 0xc6, 0xe7, 0x02, 0x4d, 0x70, 0x19, 0xae, 0xc9, 0x03, 0x68,
0xc7, 0xc1, 0x98, 0xc7, 0x39, 0x6d, 0xec, 0x34, 0x56, 0x0d, 0x3b, 0x5a, 0x8c, 0x7f, 0x56, 0x42,
0x66, 0x30, 0xe4, 0x29, 0x40, 0x12, 0xc5, 0x3c, 0x97, 0x22, 0xe5, 0x39, 0x6d, 0xa2, 0x06, 0x5d,
0xbd, 0xb8, 0x05, 0xb0, 0x0a, 0xd6, 0xfb, 0xc7, 0x85, 0xad, 0x35, 0x3e, 0xfd, 0x02, 0x4b, 0xaf,
0x42, 0x3b, 0x5d, 0x24, 0x63, 0x9e, 0xa1, 0xc3, 0x5b, 0xcc, 0x50, 0xe4, 0x06, 0xb8, 0xa9, 0x90,
0x3e, 0xff, 0x2d, 0xca, 0x25, 0xdd, 0xd8, 0xa9, 0xed, 0x3a, 0xcc, 0x49, 0x85, 0x7c, 0xa9, 0x68,
0xd2, 0x87, 0x7a, 0x14, 0xd2, 0xde, 0x4e, 0x6d, 0xb7, 0xc1, 0xea, 0x51, 0x48, 0xee, 0x42, 0x73,
0x91, 0xf3, 0xcc, 0xb8, 0x76, 0x6b, 0xc5, 0xf4, 0xf7, 0x39, 0xcf, 0x18, 0x02, 0xc8, 0x63, 0x70,
0x83, 0x3c, 0x8f, 0x66, 0x29, 0xe7, 0x39, 0x05, 0xbc, 0xe8, 0x5a, 0x74, 0x89, 0x22, 0xf7, 0xe1,
0x52, 0xc8, 0x63, 0x2e, 0x79, 0xe8, 0x97, 0xaa, 0xdd, 0x9d, 0xc6, 0x6e, 0x83, 0x0d, 0x8c, 0x60,
0xbf, 0x00, 0x7f, 0x0b, 0x9d, 0x49, 0xc6, 0x03, 0xc9, 0x43, 0xda, 0x42, 0x5b, 0xb6, 0x87, 0x33,
0x21, 0x66, 0x31, 0x1f, 0xda, 0x84, 0x1e, 0x1e, 0xda, 0xfc, 0x65, 0x16, 0xaa, 0xb4, 0x16, 0xf3,
0x10, 0xb5, 0xda, 0xe7, 0x6b, 0x19, 0xa8, 0xf2, 0xe6, 0x58, 0x84, 0x27, 0xb4, 0xa3, 0xbd, 0xa9,
0xd6, 0xca, 0xef, 0x32, 0x92, 0x31, 0xa7, 0xae, 0xf6, 0x3b, 0x12, 0xe4, 0xff, 0xd0, 0x4b, 0x85,
0x5f, 0x84, 0x8d, 0x6e, 0xa2, 0x3b, 0xbb, 0xa9, 0x28, 0x82, 0xaa, 0x20, 0x85, 0xdc, 0x8f, 0x42,
0x3a, 0x40, 0xdf, 0x76, 0x0b, 0xde, 0x28, 0x24, 0x77, 0x60, 0xa3, 0x84, 0xa4, 0x8b, 0x84, 0x5e,
0x42, 0x4c, 0xa9, 0xf7, 0x76, 0x91, 0x90, 0xbb, 0xb0, 0x59, 0x82, 0xb4, 0x29, 0x04, 0x4d, 0xe9,
0x17, 0xec, 0x43, 0xb4, 0xe9, 0x3e, 0xb4, 0x27, 0xb1, 0xc8, 0x79, 0x48, 0xb7, 0x56, 0x82, 0xf6,
0x5c, 0x88, 0xf8, 0xe0, 0x28, 0x48, 0x67, 0x9c, 0x19, 0x88, 0x02, 0xc7, 0x62, 0xf2, 0x0b, 0x0f,
0xe9, 0xf5, 0xcf, 0x80, 0x35, 0x44, 0x5d, 0x65, 0xbe, 0x88, 0x63, 0x3f, 0xe3, 0xbf, 0x2e, 0x78,
0x2e, 0xe9, 0x4d, 0x7d, 0x5b, 0xc5, 0x63, 0x9a, 0x45, 0xbe, 0x07, 0x57, 0xef, 0xec, 0x07, 0x92,
0x5e, 0x39, 0xd7, 0xe5, 0x8e, 0x06, 0xef, 0x4b, 0xf2, 0xa8, 0x50, 0x1c, 0x9f, 0xd0, 0xab, 0x67,
0x67, 0x9b, 0xd1, 0x78, 0x7e, 0xa2, 0xac, 0xc9, 0x78, 0x22, 0x8e, 0xb9, 0x8f, 0xc5, 0x46, 0xaf,
0x61, 0xe6, 0x74, 0x35, 0x0f, 0xcb, 0x10, 0x93, 0x32, 0x0c, 0x8d, 0x9c, 0x7e, 0xa6, 0x5e, 0x9d,
0x20, 0x0c, 0xb5, 0xca, 0x0f, 0xd0, 0x99, 0x88, 0x24, 0xe1, 0xa9, 0xa4, 0x0e, 0x2a, 0xdc, 0x59,
0xd7, 0xe2, 0x0e, 0x34, 0xa4, 0x68, 0x2d, 0x56, 0x87, 0xbc, 0x84, 0xbe, 0x59, 0xfa, 0xb9, 0x0c,
0xe4, 0x22, 0xa7, 0x7d, 0xbc, 0xcb, 0xed, 0x75, 0xbb, 0xbc, 0x3b, 0x49, 0x27, 0xef, 0x10, 0xc5,
0x36, 0x8c, 0x96, 0x26, 0xc9, 0x1e, 0xb4, 0xf8, 0xb1, 0xb2, 0x61, 0x1b, 0x6d, 0xb8, 0xbe, 0x4e,
0xfb, 0xa5, 0x02, 0x30, 0x8d, 0x23, 0xfb, 0xd0, 0xc3, 0x85, 0x3d, 0xf5, 0xc6, 0x85, 0x4e, 0xed,
0xa2, 0x8e, 0x39, 0xf3, 0x21, 0xb4, 0x33, 0x7e, 0x1c, 0xf1, 0x8f, 0xf4, 0x16, 0x1e, 0x7a, 0x65,
0x45, 0x99, 0xa1, 0x90, 0x19, 0x10, 0x39, 0x80, 0x0d, 0xbd, 0xb2, 0x47, 0xde, 0xbe, 0xd0, 0x91,
0x3d, 0xad, 0xa4, 0x29, 0xef, 0x36, 0x40, 0x99, 0x67, 0x64, 0x00, 0x8d, 0xe3, 0x20, 0xc6, 0xce,
0xe6, 0x30, 0xb5, 0xf4, 0x1e, 0x43, 0xb7, 0x12, 0x26, 0xd3, 0x9d, 0x6a, 0x45, 0x77, 0x22, 0xd0,
0x4c, 0x83, 0x84, 0xdb, 0xb6, 0xa7, 0xd6, 0xde, 0xef, 0xb0, 0xb9, 0xd2, 0x57, 0x4f, 0xa9, 0x15,
0xb5, 0x5c, 0xaf, 0xd6, 0x72, 0x59, 0x37, 0x8d, 0xf3, 0xeb, 0xa6, 0x6c, 0xae, 0x4d, 0xdc, 0xd6,
0x50, 0xde, 0x9f, 0x2d, 0x18, 0xac, 0xc6, 0xe8, 0xd4, 0xf9, 0xb7, 0x00, 0x74, 0xb0, 0xd4, 0x04,
0x36, 0x46, 0xb8, 0xc8, 0x39, 0x3c, 0x99, 0x73, 0x72, 0x1d, 0x9c, 0x60, 0x22, 0x45, 0xa6, 0xba,
0x45, 0x03, 0x95, 0x3a, 0x48, 0x8f, 0xc2, 0x6a, 0x17, 0x6c, 0x5e, 0xbc, 0x0b, 0xde, 0x83, 0x96,
0x2e, 0x81, 0xd6, 0xe9, 0x59, 0x5a, 0x94, 0x80, 0x86, 0x90, 0xef, 0xc0, 0x2d, 0xdb, 0x99, 0xee,
0x99, 0x67, 0x0f, 0xac, 0x12, 0x4a, 0xfe, 0x07, 0x5d, 0xdb, 0xc4, 0x95, 0xdd, 0x1d, 0xb4, 0x1b,
0x2c, 0x6b, 0x14, 0x56, 0x00, 0x78, 0x31, 0x67, 0x09, 0xa0, 0xee, 0xf6, 0x10, 0xda, 0xaa, 0x08,
0x22, 0x89, 0x2d, 0xf6, 0x74, 0xfe, 0x1d, 0xa0, 0x90, 0x19, 0x90, 0xda, 0x2f, 0xe3, 0x2a, 0xe2,
0xfe, 0x34, 0x13, 0x09, 0xed, 0xa2, 0x17, 0x41, 0xb3, 0x5e, 0x65, 0x22, 0x51, 0x73, 0xce, 0x00,
0xa4, 0xc0, 0x89, 0xe6, 0x32, 0x47, 0x33, 0x0e, 0x85, 0xd6, 0x56, 0x89, 0xa8, 0xad, 0xd9, 0xd0,
0xd6, 0x58, 0xd6, 0x28, 0x24, 0x43, 0xd8, 0x32, 0xe9, 0x6d, 0xba, 0x9d, 0x06, 0xf6, 0x11, 0x78,
0x49, 0x8b, 0x98, 0x95, 0x8c, 0x42, 0xf2, 0x14, 0x36, 0x24, 0x0f, 0x12, 0xdf, 0x6e, 0x81, 0x7d,
0xfe, 0x74, 0x0f, 0x3b, 0xe4, 0x41, 0xc2, 0x7a, 0x0a, 0xc9, 0x0c, 0x90, 0xbc, 0x85, 0x41, 0x18,
0xe5, 0x49, 0x94, 0xab, 0xe6, 0x67, 0x2a, 0x70, 0x13, 0x95, 0x57, 0x5b, 0xcf, 0x0b, 0x0b, 0xd3,
0xba, 0xba, 0x01, 0x6c, 0x86, 0xcb, 0x5c, 0x95, 0x5d, 0x42, 0x1e, 0xf1, 0xcc, 0xff, 0x90, 0x8b,
0x94, 0xc2, 0x4e, 0x6d, 0xb7, 0xc7, 0x5c, 0xe4, 0xbc, 0xce, 0x45, 0xea, 0x7d, 0xaa, 0xc1, 0xf6,
0xd9, 0xdb, 0x69, 0xaf, 0xe1, 0xbd, 0x8b, 0x94, 0x75, 0x34, 0x63, 0x14, 0xe2, 0xc4, 0xd6, 0x4a,
0x41, 0xec, 0x27, 0x3c, 0xcf, 0x83, 0x19, 0xc7, 0x14, 0x75, 0xd9, 0xa0, 0x10, 0xbc, 0xd1, 0x7c,
0x55, 0x65, 0xaa, 0x33, 0x70, 0xcc, 0x54, 0x97, 0x69, 0xe2, 0x75, 0xd3, 0xa9, 0x0f, 0x1a, 0xde,
0x7b, 0xe8, 0x55, 0x83, 0xfa, 0x05, 0xaf, 0x9a, 0x1b, 0xe0, 0xea, 0x04, 0xb0, 0xd5, 0xe1, 0x32,
0x47, 0x33, 0x46, 0xa1, 0xf7, 0xa9, 0x6e, 0xf7, 0x35, 0xbe, 0x58, 0xad, 0xbc, 0x6a, 0x69, 0xd5,
0xcf, 0x2c, 0xad, 0xc6, 0xc5, 0x4b, 0xcb, 0x3e, 0x15, 0x9a, 0xcb, 0x4f, 0x05, 0x7d, 0xf1, 0x56,
0xe5, 0xe2, 0xcb, 0x86, 0xb7, 0x97, 0x0d, 0x57, 0x8e, 0xd5, 0x76, 0x05, 0x79, 0x2e, 0x26, 0x11,
0x0e, 0x15, 0xf3, 0xfc, 0x18, 0xa0, 0x60, 0xbf, 0xe4, 0xaf, 0x04, 0xd8, 0x59, 0x0d, 0xf0, 0x21,
0x5c, 0x59, 0xdb, 0x7a, 0xc9, 0x33, 0xe8, 0xe6, 0x3c, 0x3b, 0xe6, 0x99, 0xaf, 0x9e, 0x39, 0xe6,
0x05, 0xff, 0xb9, 0x5b, 0x82, 0x86, 0xbf, 0x08, 0x24, 0x57, 0x9f, 0x81, 0xed, 0xb3, 0x07, 0xe0,
0x29, 0x47, 0xdb, 0x77, 0x63, 0xfd, 0xbc, 0x77, 0xa3, 0x75, 0x60, 0xa3, 0xe2, 0xc0, 0xff, 0xd6,
0xe5, 0x2a, 0x6f, 0xbd, 0xd6, 0x85, 0xdf, 0x7a, 0xde, 0x13, 0x80, 0xd2, 0xa6, 0x75, 0x93, 0x22,
0x16, 0xb3, 0x28, 0xb5, 0x93, 0x02, 0x09, 0xef, 0x91, 0xd5, 0x51, 0xd5, 0xbc, 0x6e, 0x28, 0xe5,
0xf1, 0x62, 0x66, 0xb3, 0x56, 0xad, 0x3d, 0x1f, 0xe7, 0x58, 0xe1, 0xad, 0xaf, 0x4c, 0x62, 0xeb,
0x10, 0x0c, 0xaa, 0xde, 0x61, 0x7c, 0x2e, 0x4c, 0xaa, 0xdf, 0x2b, 0x1a, 0xa2, 0xf6, 0x22, 0xa9,
0xe2, 0x96, 0xbb, 0xa1, 0xe7, 0x41, 0xc7, 0x28, 0x93, 0x6b, 0xd0, 0x99, 0x09, 0xbf, 0xd8, 0xdf,
0x65, 0xed, 0x99, 0x50, 0x02, 0x2f, 0x04, 0xb7, 0x50, 0x44, 0x2b, 0x8f, 0x82, 0xc7, 0x06, 0x82,
0x6b, 0x35, 0x7f, 0xb3, 0xe0, 0x23, 0x9e, 0xd6, 0x63, 0x6a, 0xa9, 0x1e, 0x50, 0x61, 0x34, 0x9d,
0xfa, 0x32, 0xe3, 0xdc, 0x94, 0xc5, 0xd2, 0xf4, 0x78, 0x11, 0x4d, 0xa7, 0x87, 0x19, 0xe7, 0xcc,
0x09, 0xcd, 0xca, 0x7b, 0x86, 0x57, 0xb5, 0x02, 0xf2, 0x00, 0x9a, 0xd3, 0x28, 0x56, 0xd9, 0x76,
0xea, 0xef, 0x63, 0x31, 0xaf, 0xa2, 0x98, 0x33, 0x44, 0x79, 0x09, 0x0e, 0xef, 0xaa, 0x40, 0x19,
0x6a, 0x36, 0x40, 0x43, 0xd5, 0x5a, 0x85, 0x25, 0x08, 0x43, 0x6e, 0x6b, 0x58, 0x13, 0x84, 0x42,
0xc7, 0x7c, 0x1b, 0xec, 0xd8, 0x34, 0xa4, 0x9a, 0xd6, 0xe3, 0x28, 0x0d, 0x32, 0x5d, 0xa7, 0x0e,
0x33, 0x94, 0xf7, 0x07, 0xf4, 0x97, 0xff, 0x88, 0x6a, 0x8f, 0x79, 0x26, 0x3e, 0xf0, 0x89, 0x34,
0x07, 0x5a, 0x92, 0x3c, 0xd0, 0x0f, 0xc3, 0x48, 0xe6, 0xb4, 0x8e, 0x77, 0x59, 0x17, 0x0e, 0x0b,
0x21, 0x77, 0x54, 0x84, 0xa7, 0xf6, 0x93, 0xb8, 0xb9, 0x1c, 0xe1, 0x29, 0x43, 0xa1, 0x37, 0x84,
0xb6, 0xa6, 0xd1, 0xf3, 0x7c, 0x6a, 0x8e, 0x54, 0xcb, 0x22, 0x3e, 0xf5, 0x32, 0x3e, 0xe3, 0x36,
0x26, 0xf2, 0x37, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x46, 0xe0, 0x26, 0x49, 0xef, 0x0f, 0x00,
0x00,
}

Просмотреть файл

@ -73,6 +73,11 @@ message GithubIssueMutation {
repeated GithubIssueEvent event = 26; // new events to add
GithubIssueSyncStatus event_status = 27;
repeated GithubReview review = 29; // new reviews to add
GithubIssueSyncStatus review_status = 30;
// Next tag: 31
}
// BoolChange represents a change to a boolean value.
@ -160,6 +165,27 @@ message GithubCommit {
string commit_id = 3; // "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
}
// Contents of a pull request review - when someone
// comments, requests changes, or approves changes
// on a pull request. See
// https://developer.github.com/v3/pulls/reviews/ for more information.
message GithubReview {
// Required:
int64 id = 1;
int64 actor_id = 2;
google.protobuf.Timestamp created = 3; // time of the event
string body = 4; // body of the review comment
string state = 5; // COMMENTED, APPROVED, CHANGES_REQUESTED
string commit_id = 6;
string actor_association = 7;
// other_json is usually empty.
bytes other_json = 8;
// Next tag: 9
}
// GithubIssueSyncStatus notes where syncing is at for comments
// on an issue,
// This mutation type is only made at/after the same top-level mutation