// GetMaintainer gets the MAINTAINER configuration file and returns // a subset of the file with members belonging to the specified organization. func GetMaintainerOrg(c *gin.Context) { var ( owner = c.Param("owner") name = c.Param("repo") team = c.Param("org") user = session.User(c) ) repo, err := store.GetRepoOwnerName(c, owner, name) if err != nil { log.Errorf("Error getting repository %s. %s", name, err) c.AbortWithStatus(404) return } file, err := remote.GetContents(c, user, repo, "MAINTAINERS") if err != nil { log.Errorf("Error getting repository %s. %s", repo.Slug, err) c.String(404, "MAINTAINERS file not found. %s", err) return } 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 } subset, err := model.FromOrg(maintainer, team) if err != nil { log.Errorf("Error getting subset of MAINTAINERS file for %s/%s. %s", repo.Slug, team, err) c.String(500, "Error getting subset of MAINTAINERS file. %s.", err) return } c.JSON(200, subset) }
// GetMaintainer gets the MAINTAINER configuration file. func GetMaintainer(c *gin.Context) { var ( owner = c.Param("owner") name = c.Param("repo") user = session.User(c) ) repo, err := store.GetRepoOwnerName(c, owner, name) if err != nil { log.Errorf("Error getting repository %s. %s", name, err) c.AbortWithStatus(404) return } 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 { log.Printf("found %v members", len(members)) 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 } c.JSON(200, maintainer) }
func getConfigAndMaintainers(c *gin.Context, user *model.User, repo *model.Repo) (*model.Config, *model.Maintainer, error) { rcfile, _ := remote.GetContents(c, user, repo, ".lgtm") deployFile, _ := remote.GetContents(c, user, repo, "DEPLOYMENTS") config, err := model.ParseConfig(rcfile, deployFile) 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 nil, nil, err } // 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 nil, nil, err } 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 nil, nil, err } return config, maintainer, nil }
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, }) }