func()

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
}