func getRepoAndUser(c *gin.Context, slug string) (*model.Repo, *model.User, error) { repo, err := store.GetRepoSlug(c, slug) if err != nil { log.Errorf("Error getting repository %s. %s", slug, err) c.String(404, "Repository not found.") return nil, nil, err } user, err := store.GetUser(c, repo.UserID) if err != nil { log.Errorf("Error getting repository owner %s. %s", repo.Slug, err) c.String(404, "Repository owner not found.") return nil, nil, err } return repo, user, err }
func Hook(c *gin.Context) { hook, err := remote.GetHook(c, c.Request) if err != nil { log.Errorf("Error parsing hook. %s", err) c.String(500, "Error parsing hook. %s", err) return } if hook == nil { c.String(200, "pong") return } repo, err := store.GetRepoSlug(c, hook.Repo.Slug) if err != nil { log.Errorf("Error getting repository %s. %s", hook.Repo.Slug, err) c.String(404, "Repository not found.") return } user, err := store.GetUser(c, repo.UserID) if err != nil { log.Errorf("Error getting repository owner %s. %s", repo.Slug, err) c.String(404, "Repository owner not found.") return } rcfile, _ := remote.GetContents(c, user, repo, ".lgtm") config, err := model.ParseConfig(rcfile) if err != nil { log.Errorf("Error parsing .lgtm file for %s. %s", repo.Slug, err) c.String(500, "Error parsing .lgtm file. %s.", err) return } // THIS IS COMPLETELY DUPLICATED IN THE API SECTION. NOT IDEAL file, err := remote.GetContents(c, user, repo, "MAINTAINERS") if err != nil { log.Debugf("no MAINTAINERS file for %s. Checking for team members.", repo.Slug) members, merr := cache.GetMembers(c, user, repo.Owner) if merr != nil { log.Errorf("Error getting repository %s. %s", repo.Slug, err) log.Errorf("Error getting org members %s. %s", repo.Owner, merr) c.String(404, "MAINTAINERS file not found. %s", err) return } else { for _, member := range members { file = append(file, member.Login...) file = append(file, '\n') } } } maintainer, err := model.ParseMaintainer(file) if err != nil { log.Errorf("Error parsing MAINTAINERS file for %s. %s", repo.Slug, err) c.String(500, "Error parsing MAINTAINERS file. %s.", err) return } comments, err := remote.GetComments(c, user, repo, hook.Issue.Number) if err != nil { log.Errorf("Error retrieving comments for %s pr %d. %s", repo.Slug, hook.Issue.Number, err) c.String(500, "Error retrieving comments. %s.", err) return } approvers := getApprovers(config, maintainer, hook.Issue, comments) approved := len(approvers) >= config.Approvals err = remote.SetStatus(c, user, repo, hook.Issue.Number, len(approvers), config.Approvals) if err != nil { log.Errorf("Error setting status for %s pr %d. %s", repo.Slug, hook.Issue.Number, err) c.String(500, "Error setting status. %s.", err) return } log.Debugf("processed comment for %s. received %d of %d approvals", repo.Slug, len(approvers), config.Approvals) c.IndentedJSON(200, gin.H{ "approvers": maintainer.People, "settings": config, "approved": approved, "approved_by": approvers, }) }