in pkg/repo/repo.go [460:528]
func (r *Repo) loadKEPFromYaml(repoPath, kepPath string) (*api.Proposal, error) {
fullKEPPath := filepath.Join(repoPath, kepPath)
b, err := ioutil.ReadFile(fullKEPPath)
if err != nil {
return nil, fmt.Errorf("unable to read KEP metadata for %s: %w", fullKEPPath, err)
}
var p api.Proposal
err = yaml.UnmarshalStrict(b, &p)
if err != nil {
return nil, fmt.Errorf("unable to load KEP metadata: %s", err)
}
p.Name = filepath.Base(filepath.Dir(kepPath))
prrApprovalPath := filepath.Join(repoPath, ProposalPathStub, PRRApprovalPathStub)
// Read the PRR approval file and add any listed PRR approvers in there
// to the PRR approvers list in the KEP. this is a hack while we transition
// away from PRR approvers listed in kep.yaml
handler := r.PRRHandler
err = kepval.ValidatePRR(&p, handler, prrApprovalPath)
if err != nil {
logrus.Errorf(
"%v",
errors.Wrapf(err, "validating PRR for %s", p.Name),
)
} else {
sig := filepath.Base(filepath.Dir(filepath.Dir(kepPath)))
prrPath := filepath.Join(
prrApprovalPath,
sig,
p.Number+".yaml",
)
prrFile, err := os.Open(prrPath)
if os.IsNotExist(err) {
return &p, nil
}
if err != nil {
return nil, errors.Wrapf(err, "opening PRR approval %s", prrPath)
}
approval, err := handler.Parse(prrFile)
if err != nil {
return nil, errors.Wrapf(err, "parsing PRR")
}
approver, err := approval.ApproverForStage(p.Stage)
if err != nil {
logrus.Errorf(
"%v",
fmt.Errorf("getting PRR approver for stage '%s' for kep %s: %w", p.Stage, fullKEPPath, err),
)
}
for _, a := range p.PRRApprovers {
if a == approver {
approver = ""
}
}
if approver != "" {
p.PRRApprovers = append(p.PRRApprovers, approver)
}
}
return &p, nil
}