mirror of https://github.com/harness/drone.git
feat: codeowners multi location (#785)
parent
281dc6b02a
commit
8c68b0cd51
|
@ -67,7 +67,7 @@ func (e *TooLargeError) Is(target error) bool {
|
|||
}
|
||||
|
||||
type Config struct {
|
||||
FilePath string
|
||||
FilePaths []string
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
|
@ -130,10 +130,6 @@ func (s *Service) get(
|
|||
ref string,
|
||||
) (*CodeOwners, error) {
|
||||
codeOwnerFile, err := s.getCodeOwnerFile(ctx, repo, ref)
|
||||
// no codeowner file
|
||||
if gitrpc.ErrorStatus(err) == gitrpc.StatusPathNotFound {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to get codeowner file: %w", err)
|
||||
}
|
||||
|
@ -193,15 +189,10 @@ func (s *Service) getCodeOwnerFile(
|
|||
if ref == "" {
|
||||
ref = "refs/heads/" + repo.DefaultBranch
|
||||
}
|
||||
node, err := s.git.GetTreeNode(ctx, &gitrpc.GetTreeNodeParams{
|
||||
ReadParams: params,
|
||||
GitREF: ref,
|
||||
Path: s.config.FilePath,
|
||||
})
|
||||
node, err := s.getCodeOwnerFileNode(ctx, params, ref)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to retrieve codeowner file %w", err)
|
||||
return nil, fmt.Errorf("cannot get codeowner file : %w", err)
|
||||
}
|
||||
|
||||
if node.Node.Mode != gitrpc.TreeNodeModeFile {
|
||||
return nil, fmt.Errorf(
|
||||
"codeowner file is of format '%s' but expected to be of format '%s'",
|
||||
|
@ -231,6 +222,33 @@ func (s *Service) getCodeOwnerFile(
|
|||
}, nil
|
||||
}
|
||||
|
||||
func (s *Service) getCodeOwnerFileNode(
|
||||
ctx context.Context,
|
||||
params gitrpc.ReadParams,
|
||||
ref string,
|
||||
) (*gitrpc.GetTreeNodeOutput, error) {
|
||||
// iterating over multiple possible codeowner file path to get the file
|
||||
// todo: once we have api to get multi file we can simplify
|
||||
for _, path := range s.config.FilePaths {
|
||||
node, err := s.git.GetTreeNode(ctx, &gitrpc.GetTreeNodeParams{
|
||||
ReadParams: params,
|
||||
GitREF: ref,
|
||||
Path: path,
|
||||
})
|
||||
|
||||
if gitrpc.ErrorStatus(err) == gitrpc.StatusPathNotFound {
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error encountered retrieving codeowner : %w", err)
|
||||
}
|
||||
log.Ctx(ctx).Debug().Msgf("using codeowner file from path %s", path)
|
||||
return node, nil
|
||||
}
|
||||
// get of codeowner file gives err at all the location then returning one of the error
|
||||
return nil, fmt.Errorf("no codeowner file found: %w", ErrNotFound)
|
||||
}
|
||||
|
||||
func (s *Service) getApplicableCodeOwnersForPR(
|
||||
ctx context.Context,
|
||||
repo *types.Repository,
|
||||
|
|
|
@ -339,6 +339,6 @@ func ProvideCleanupConfig(config *types.Config) cleanup.Config {
|
|||
// ProvideCodeOwnerConfig loads the codeowner config from the main config.
|
||||
func ProvideCodeOwnerConfig(config *types.Config) codeowners.Config {
|
||||
return codeowners.Config{
|
||||
FilePath: config.CodeOwners.FilePath,
|
||||
FilePaths: config.CodeOwners.FilePaths,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -283,7 +283,7 @@ type Config struct {
|
|||
}
|
||||
|
||||
CodeOwners struct {
|
||||
FilePath string `envconfig:"GITNESS_CODEOWNERS_FILEPATH" default:".harness/CODEOWNERS"`
|
||||
FilePaths []string `envconfig:"GITNESS_CODEOWNERS_FILEPATH" default:"CODEOWNERS,.harness/CODEOWNERS"`
|
||||
}
|
||||
|
||||
SMTP struct {
|
||||
|
|
Loading…
Reference in New Issue