in maintner/github.go [1261:1447]
func (c *Corpus) processGithubIssueMutation(m *maintpb.GithubIssueMutation) {
if c == nil {
panic("nil corpus")
}
c.initGithub()
gr := c.github.getOrCreateRepo(m.Owner, m.Repo)
if gr == nil {
log.Printf("bogus Owner/Repo %q/%q in mutation: %v", m.Owner, m.Repo, m)
return
}
if m.Number == 0 {
log.Printf("bogus zero Number in mutation: %v", m)
return
}
gi, ok := gr.issues[m.Number]
if !ok {
gi = &GitHubIssue{
// User added below
Number: m.Number,
ID: m.Id,
}
if gr.issues == nil {
gr.issues = make(map[int32]*GitHubIssue)
}
gr.issues[m.Number] = gi
if m.NotExist {
gi.NotExist = true
return
}
var err error
gi.Created, err = ptypes.Timestamp(m.Created)
if err != nil {
panic(err)
}
}
if m.NotExist != gi.NotExist {
gi.NotExist = m.NotExist
}
if gi.NotExist {
return
}
// Check Updated before all other fields so they don't update if this
// Mutation is stale
// (ignoring Created since it *should* never update)
if m.Updated != nil {
t, err := ptypes.Timestamp(m.Updated)
if err != nil {
panic(err)
}
gi.Updated = t
}
if m.ClosedAt != nil {
t, err := ptypes.Timestamp(m.ClosedAt)
if err != nil {
panic(err)
}
gi.ClosedAt = t
}
if m.User != nil {
gi.User = c.github.getUser(m.User)
}
if m.NoMilestone {
gi.Milestone = noMilestone
} else if m.MilestoneId != 0 {
ms := gr.getOrCreateMilestone(m.MilestoneId)
ms.processMutation(maintpb.GithubMilestone{
Id: m.MilestoneId,
Title: m.MilestoneTitle,
Number: m.MilestoneNum,
})
gi.Milestone = ms
}
if m.ClosedBy != nil {
gi.ClosedBy = c.github.getUser(m.ClosedBy)
}
if b := m.Closed; b != nil {
gi.Closed = b.Val
}
if b := m.Locked; b != nil {
gi.Locked = b.Val
}
if m.PullRequest {
gi.PullRequest = true
}
gi.Assignees = c.github.setAssigneesFromProto(gi.Assignees, m.Assignees, m.DeletedAssignees)
if m.Body != "" {
gi.Body = m.Body
}
if m.BodyChange != nil {
gi.Body = m.BodyChange.Val
}
if m.Title != "" {
gi.Title = m.Title
}
if len(m.RemoveLabel) > 0 || len(m.AddLabel) > 0 {
if gi.Labels == nil {
gi.Labels = make(map[int64]*GitHubLabel)
}
for _, lid := range m.RemoveLabel {
delete(gi.Labels, lid)
}
for _, lp := range m.AddLabel {
lb := gr.getOrCreateLabel(lp.Id)
lb.processMutation(*lp)
gi.Labels[lp.Id] = lb
}
}
for _, cmut := range m.Comment {
if cmut.Id == 0 {
log.Printf("Ignoring bogus comment mutation lacking Id: %v", cmut)
continue
}
gc, ok := gi.comments[cmut.Id]
if !ok {
if gi.comments == nil {
gi.comments = make(map[int64]*GitHubComment)
}
gc = &GitHubComment{ID: cmut.Id}
gi.comments[gc.ID] = gc
}
if cmut.User != nil {
gc.User = c.github.getUser(cmut.User)
}
if cmut.Created != nil {
gc.Created, _ = ptypes.Timestamp(cmut.Created)
gc.Created = gc.Created.UTC()
}
if cmut.Updated != nil {
gc.Updated, _ = ptypes.Timestamp(cmut.Updated)
gc.Updated = gc.Updated.UTC()
}
if cmut.Body != "" {
gc.Body = cmut.Body
}
}
if m.CommentStatus != nil && m.CommentStatus.ServerDate != nil {
if serverDate, err := ptypes.Timestamp(m.CommentStatus.ServerDate); err == nil {
gi.commentsSyncedAsOf = serverDate.UTC()
}
}
for _, emut := range m.Event {
if emut.Id == 0 {
log.Printf("Ignoring bogus event mutation lacking Id: %v", emut)
continue
}
if gi.events == nil {
gi.events = make(map[int64]*GitHubIssueEvent)
}
gie := gr.newGithubEvent(emut)
gi.events[emut.Id] = gie
if gie.Created.After(gi.eventMaxTime) {
gi.eventMaxTime = gie.Created
}
}
if m.EventStatus != nil && m.EventStatus.ServerDate != nil {
if serverDate, err := ptypes.Timestamp(m.EventStatus.ServerDate); err == nil {
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()
}
}
}