refactor: more domain splitting
This commit is contained in:
parent
36d33895b7
commit
1a5c102c2f
@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@ -12,9 +13,7 @@ import (
|
|||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var validContributorStatuses = []string{"official", "partner", "community"}
|
||||||
validContributorStatuses = []string{"official", "partner", "community"}
|
|
||||||
)
|
|
||||||
|
|
||||||
type contributorProfileFrontmatter struct {
|
type contributorProfileFrontmatter struct {
|
||||||
DisplayName string `yaml:"display_name"`
|
DisplayName string `yaml:"display_name"`
|
||||||
@ -48,10 +47,7 @@ func validateContributorGithubUsername(githubUsername string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateContributorEmployerGithubUsername(
|
func validateContributorEmployerGithubUsername(employerGithubUsername *string, githubUsername string) []error {
|
||||||
employerGithubUsername *string,
|
|
||||||
githubUsername string,
|
|
||||||
) []error {
|
|
||||||
if employerGithubUsername == nil {
|
if employerGithubUsername == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -337,9 +333,7 @@ func aggregateContributorReadmeFiles() ([]readme, error) {
|
|||||||
return allReadmeFiles, nil
|
return allReadmeFiles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateContributorRelativeUrls(
|
func validateContributorRelativeUrls(contributors map[string]contributorProfile) error {
|
||||||
contributors map[string]contributorProfile,
|
|
||||||
) error {
|
|
||||||
// This function only validates relative avatar URLs for now, but it can be
|
// This function only validates relative avatar URLs for now, but it can be
|
||||||
// beefed up to validate more in the future
|
// beefed up to validate more in the future
|
||||||
problems := []error{}
|
problems := []error{}
|
||||||
@ -376,3 +370,26 @@ func validateContributorRelativeUrls(
|
|||||||
errors: problems,
|
errors: problems,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateAllContributorFiles() error {
|
||||||
|
allReadmeFiles, err := aggregateContributorReadmeFiles()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Processing %d README files\n", len(allReadmeFiles))
|
||||||
|
contributors, err := parseContributorFiles(allReadmeFiles)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Printf("Processed %d README files as valid contributor profiles", len(contributors))
|
||||||
|
|
||||||
|
err = validateContributorRelativeUrls(contributors)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Println("All relative URLs for READMEs are valid")
|
||||||
|
|
||||||
|
log.Printf("Processed all READMEs in the %q directory\n", rootRegistryPath)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@ -11,29 +11,8 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("Starting README validation")
|
log.Println("Starting README validation")
|
||||||
allReadmeFiles, err := aggregateContributorReadmeFiles()
|
err := validateAllContributorFiles()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Processing %d README files\n", len(allReadmeFiles))
|
|
||||||
contributors, err := parseContributorFiles(allReadmeFiles)
|
|
||||||
log.Printf(
|
|
||||||
"Processed %d README files as valid contributor profiles",
|
|
||||||
len(contributors),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = validateContributorRelativeUrls(contributors)
|
|
||||||
if err != nil {
|
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
log.Println("All relative URLs for READMEs are valid")
|
|
||||||
|
|
||||||
log.Printf(
|
|
||||||
"Processed all READMEs in the %q directory\n",
|
|
||||||
rootRegistryPath,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|||||||
116
cmd/readmevalidation/repoStructure.go
Normal file
116
cmd/readmevalidation/repoStructure.go
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
)
|
||||||
|
|
||||||
|
var supportedResourceTypes = []string{"modules", "templates"}
|
||||||
|
|
||||||
|
func validateCoderResourceSubdirectory(dirPath string) []error {
|
||||||
|
errs := []error{}
|
||||||
|
|
||||||
|
dir, err := os.Stat(dirPath)
|
||||||
|
if err != nil {
|
||||||
|
// It's valid for a specific resource directory not to exist. It's just
|
||||||
|
// that if it does exist, it must follow specific rules
|
||||||
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
|
errs = append(errs, addFilePathToError(dirPath, err))
|
||||||
|
}
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
|
||||||
|
if !dir.IsDir() {
|
||||||
|
errs = append(errs, fmt.Errorf("%q: path is not a directory", dirPath))
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := os.ReadDir(dirPath)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, fmt.Errorf("%q: %v", dirPath, err))
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
for _, f := range files {
|
||||||
|
if !f.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceReadmePath := path.Join(dirPath, f.Name(), "README.md")
|
||||||
|
_, err := os.Stat(resourceReadmePath)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
errs = append(errs, fmt.Errorf("%q: 'README.md' does not exist", resourceReadmePath))
|
||||||
|
} else {
|
||||||
|
errs = append(errs, addFilePathToError(resourceReadmePath, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mainTerraformPath := path.Join(dirPath, f.Name(), "main.tf")
|
||||||
|
_, err = os.Stat(mainTerraformPath)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
errs = append(errs, fmt.Errorf("%q: 'main.tf' file does not exist", mainTerraformPath))
|
||||||
|
} else {
|
||||||
|
errs = append(errs, addFilePathToError(mainTerraformPath, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateRegistryDirectory() []error {
|
||||||
|
dirEntries, err := os.ReadDir(rootRegistryPath)
|
||||||
|
if err != nil {
|
||||||
|
return []error{err}
|
||||||
|
}
|
||||||
|
|
||||||
|
problems := []error{}
|
||||||
|
for _, e := range dirEntries {
|
||||||
|
dirPath := path.Join(rootRegistryPath, e.Name())
|
||||||
|
if !e.IsDir() {
|
||||||
|
problems = append(problems, fmt.Errorf("detected non-directory file %q at base of main Registry directory", dirPath))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
readmePath := path.Join(dirPath, "README.md")
|
||||||
|
_, err := os.Stat(readmePath)
|
||||||
|
if err != nil {
|
||||||
|
problems = append(problems, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rType := range supportedResourceTypes {
|
||||||
|
resourcePath := path.Join(dirPath, rType)
|
||||||
|
if errs := validateCoderResourceSubdirectory(resourcePath); len(errs) != 0 {
|
||||||
|
problems = append(problems, errs...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return problems
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateRepoStructure() error {
|
||||||
|
var problems []error
|
||||||
|
if errs := validateRegistryDirectory(); len(errs) != 0 {
|
||||||
|
problems = append(problems, errs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := os.Stat("./.icons")
|
||||||
|
if err != nil {
|
||||||
|
problems = append(problems, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Todo: figure out what other directories we want to make guarantees for
|
||||||
|
// and add them to this function
|
||||||
|
if len(problems) != 0 {
|
||||||
|
return validationPhaseError{
|
||||||
|
phase: validationPhaseFileStructureValidation,
|
||||||
|
errors: problems,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user