func (sq *SubmitQueue) doGenCommitters(config *github_util.Config) error { pushUsers, pullUsers, err := config.UsersWithAccess() if err != nil { glog.Fatalf("Unable to read committers from github: %v", err) } pushSet := sets.NewString() for _, user := range pushUsers { pushSet.Insert(*user.Login) } pullSet := sets.NewString() for _, user := range pullUsers { pullSet.Insert(*user.Login) } if err = writeWhitelist(sq.Committers, "# auto-generated by "+os.Args[0]+" gen-committers; manual additions should go in the whitelist", pushSet); err != nil { glog.Fatalf("Unable to write committers: %v", err) } glog.Info("Successfully updated committers file.") existingWhitelist, err := loadWhitelist(sq.Whitelist) if err != nil { glog.Fatalf("error loading whitelist; it will not be updated: %v", err) } neededInWhitelist := existingWhitelist.Union(pullSet) neededInWhitelist = neededInWhitelist.Difference(pushSet) if err = writeWhitelist(sq.Whitelist, "# auto-generated by "+os.Args[0]+" gen-committers; manual additions may be added by hand", neededInWhitelist); err != nil { glog.Fatalf("Unable to write additional user whitelist: %v", err) } glog.Info("Successfully update whitelist file.") return nil }
// RefreshWhitelist updates the whitelist, re-getting the list of committers. func (sq *SubmitQueue) RefreshWhitelist(config *github_util.Config) { info := map[string]userInfo{} if sq.additionalUserWhitelist == nil { users, err := loadWhitelist(sq.Whitelist) if err != nil { glog.Fatalf("error loading user whitelist: %v", err) } sq.additionalUserWhitelist = &users } if sq.committerList == nil { committerList, err := loadWhitelist(sq.Committers) if err != nil { glog.Fatalf("error loading committers whitelist: %v", err) } sq.committerList = &committerList } // We must use the values on disk in case it has users which don't have // explicit "pull" permission in the API allUsers := sets.NewString(sq.additionalUserWhitelist.List()...) pushUsers, pullUsers, err := config.UsersWithAccess() if err != nil { glog.Info("Falling back to static committers list.") allUsers = allUsers.Union(*sq.committerList) sq.userWhitelist = &allUsers return } for _, user := range pullUsers { allUsers.Insert(*user.Login) info[*user.Login] = userInfo{ Access: "pull access", AvatarURL: *user.AvatarURL, } } for _, user := range pushUsers { allUsers.Insert(*user.Login) info[*user.Login] = userInfo{ Access: "push access", AvatarURL: *user.AvatarURL, } } // Anyone we got from a config file and not from the API we need to look up info for _, login := range allUsers.List() { if _, ok := info[login]; ok { continue } user, err := config.GetUser(login) if err != nil { glog.Errorf("Unable to get user information about %q", login) continue } info[login] = userInfo{ Access: "explicitly whitelisted", AvatarURL: *user.AvatarURL, } } sq.userWhitelist = &allUsers sq.userInfo = info return }