Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ jobs:
run: |
make gogenerate
git diff --exit-code || (echo 'Generated code is out of date, please run "make gogenerate" and commit the changes in this PR.' && exit 1)
- name: check-generate-fmt
run: |
make check-generate-fmt
git checkout .
- name: Generate proto files
run: |
make genproto
Expand Down
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ gogenerate:
@$(MAKE) for-all-target TARGET="generate"
$(MAKE) fmt

.PHONY: check-generate-fmt
check-generate-fmt:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will need to run this on CI.

cd cmd/mdatagen && $(GOCMD) install .
MDATAGEN_NOFORMAT=1 $(MAKE) for-all-target TARGET="generate"
@UNFORMATTED=$$(gofmt -l .); \
if [ -n "$$UNFORMATTED" ]; then \
echo "The following generated files are not gofmt-formatted (fix the template):"; \
echo "$$UNFORMATTED"; \
exit 1; \
fi

.PHONY: govulncheck
govulncheck:
@$(MAKE) for-all-target TARGET="vulncheck"
Expand Down
30 changes: 16 additions & 14 deletions cmd/mdatagen/internal/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,21 @@ func NewCommand() (*cobra.Command, error) {
if err != nil {
return nil, err
}
noformat := os.Getenv("MDATAGEN_NOFORMAT") == "1"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't use env vars to set flags anywhere within mdatagen. I don't think starting this pattern is a good fit for this PR.

Suggested change
noformat := os.Getenv("MDATAGEN_NOFORMAT") == "1"
var noFormat bool

rootCmd := &cobra.Command{
Use: "mdatagen",
Version: ver,
SilenceUsage: true,
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
return run(args[0])
return run(args[0], noformat)
},
}
rootCmd.Flags().BoolVar(&noformat, "noformat", noformat, "skip gofmt formatting of generated Go files")
return rootCmd, nil
}

func run(ymlPath string) error {
func run(ymlPath string, noformat bool) error {
if ymlPath == "" {
return errors.New("argument must be metadata.yaml file")
}
Expand Down Expand Up @@ -104,7 +106,7 @@ func run(ymlPath string) error {
if !slices.Contains(nonComponents, md.Status.Class) {
toGenerate[filepath.Join(tmplDir, "status.go.tmpl")] = filepath.Join(codeDir, "generated_status.go")
err = generateFile(filepath.Join(tmplDir, "component_test.go.tmpl"),
filepath.Join(ymlDir, "generated_component_test.go"), md, packageName)
filepath.Join(ymlDir, "generated_component_test.go"), md, packageName, noformat)
if err != nil {
return err
}
Expand All @@ -124,7 +126,7 @@ func run(ymlPath string) error {
}

err = generateFile(filepath.Join(tmplDir, "package_test.go.tmpl"),
filepath.Join(ymlDir, "generated_package_test.go"), md, packageName)
filepath.Join(ymlDir, "generated_package_test.go"), md, packageName, noformat)
if err != nil {
return err
}
Expand Down Expand Up @@ -220,12 +222,12 @@ func run(ymlPath string) error {
}

for tmpl, dst := range toGenerate {
if err := generateFile(tmpl, dst, md, md.GeneratedPackageName); err != nil {
if err := generateFile(tmpl, dst, md, md.GeneratedPackageName, noformat); err != nil {
return err
}
}

if err := generateConfigFiles(md, ymlDir); err != nil {
if err := generateConfigFiles(md, ymlDir, noformat); err != nil {
return fmt.Errorf("failed to generate config files: %w", err)
}

Expand Down Expand Up @@ -414,8 +416,8 @@ func executeTemplate(tmplFile string, md Metadata, goPackage string, fns templat
return buf.Bytes(), nil
}

func generateFile(tmplFile, outputFile string, md Metadata, goPackage string) error {
return generateFileWithFns(tmplFile, outputFile, md, goPackage, getTemplateFuncMap(md))
func generateFile(tmplFile, outputFile string, md Metadata, goPackage string, noformat bool) error {
return generateFileWithFns(tmplFile, outputFile, md, goPackage, getTemplateFuncMap(md), noformat)
}

func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPackage string) error {
Expand Down Expand Up @@ -447,7 +449,7 @@ func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPacka
return nil
}

func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage string, fns template.FuncMap) error {
func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage string, fns template.FuncMap, noformat bool) error {
if err := os.Remove(outputFile); err != nil && !errors.Is(err, fs.ErrNotExist) {
return fmt.Errorf("unable to remove generated file %q: %w", outputFile, err)
}
Expand All @@ -457,7 +459,7 @@ func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage str
return err
}
var formatErr error
if strings.HasSuffix(outputFile, ".go") {
if strings.HasSuffix(outputFile, ".go") && !noformat {
if formatted, err := format.Source(result); err == nil {
result = formatted
} else {
Expand Down Expand Up @@ -532,7 +534,7 @@ func validateYAMLKeyOrder(raw []byte) error {
return nil
}

func generateConfigFiles(md Metadata, mdDir string) error {
func generateConfigFiles(md Metadata, mdDir string, noformat bool) error {
if md.Config != nil {
resolver := cfggen.NewResolver(md.PackageName, md.Status.Class, md.Type, mdDir)
resolvedSchema, err := resolver.ResolveSchema(md.Config)
Expand All @@ -545,14 +547,14 @@ func generateConfigFiles(md Metadata, mdDir string) error {
return fmt.Errorf("failed to write config schema: %w", err)
}

if err := generateConfigGoStruct(md, mdDir); err != nil {
if err := generateConfigGoStruct(md, mdDir, noformat); err != nil {
return fmt.Errorf("failed to generate config Go struct: %w", err)
}
}
return nil
}

func generateConfigGoStruct(md Metadata, outputDir string) error {
func generateConfigGoStruct(md Metadata, outputDir string, noformat bool) error {
rootPkg, err := helpers.RootPackage(outputDir)
if err != nil {
return fmt.Errorf("unable to determine root package: %w", err)
Expand All @@ -563,5 +565,5 @@ func generateConfigGoStruct(md Metadata, outputDir string) error {
dstFile := filepath.Join(outputDir, "generated_config.go")

fns := cfggen.WithCfgFns(getTemplateFuncMap(md), rootPkg, md.PackageName)
return generateFileWithFns(tmplFile, dstFile, md, packageName, fns)
return generateFileWithFns(tmplFile, dstFile, md, packageName, fns, noformat)
}
Loading