Skip to content

Commit d0861fe

Browse files
committed
feat(mdatagen): add gofmt validation and fix template formatting bugs
Signed-off-by: atilsensalduz <atil.sensalduz@gmail.com>
1 parent 85fc191 commit d0861fe

3 files changed

Lines changed: 32 additions & 15 deletions

File tree

.github/workflows/build-and-test.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ jobs:
123123
run: |
124124
make gogenerate
125125
git diff --exit-code || (echo 'Generated code is out of date, please run "make gogenerate" and commit the changes in this PR.' && exit 1)
126+
- name: check-generate-fmt
127+
run: |
128+
make check-generate-fmt
129+
git checkout .
126130
- name: Generate proto files
127131
run: |
128132
make genproto

Makefile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ gogenerate:
104104
@$(MAKE) for-all-target TARGET="generate"
105105
$(MAKE) fmt
106106

107+
.PHONY: check-generate-fmt
108+
check-generate-fmt:
109+
cd cmd/mdatagen && $(GOCMD) install .
110+
MDATAGEN_NOFORMAT=1 $(MAKE) for-all-target TARGET="generate"
111+
@UNFORMATTED=$$(gofmt -l .); \
112+
if [ -n "$$UNFORMATTED" ]; then \
113+
echo "The following generated files are not gofmt-formatted (fix the template):"; \
114+
echo "$$UNFORMATTED"; \
115+
exit 1; \
116+
fi
117+
107118
.PHONY: govulncheck
108119
govulncheck:
109120
@$(MAKE) for-all-target TARGET="vulncheck"

cmd/mdatagen/internal/command.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,21 @@ func NewCommand() (*cobra.Command, error) {
5858
if err != nil {
5959
return nil, err
6060
}
61+
noformat := os.Getenv("MDATAGEN_NOFORMAT") == "1"
6162
rootCmd := &cobra.Command{
6263
Use: "mdatagen",
6364
Version: ver,
6465
SilenceUsage: true,
6566
Args: cobra.ExactArgs(1),
6667
RunE: func(_ *cobra.Command, args []string) error {
67-
return run(args[0])
68+
return run(args[0], noformat)
6869
},
6970
}
71+
rootCmd.Flags().BoolVar(&noformat, "noformat", noformat, "skip gofmt formatting of generated Go files")
7072
return rootCmd, nil
7173
}
7274

73-
func run(ymlPath string) error {
75+
func run(ymlPath string, noformat bool) error {
7476
if ymlPath == "" {
7577
return errors.New("argument must be metadata.yaml file")
7678
}
@@ -104,7 +106,7 @@ func run(ymlPath string) error {
104106
if !slices.Contains(nonComponents, md.Status.Class) {
105107
toGenerate[filepath.Join(tmplDir, "status.go.tmpl")] = filepath.Join(codeDir, "generated_status.go")
106108
err = generateFile(filepath.Join(tmplDir, "component_test.go.tmpl"),
107-
filepath.Join(ymlDir, "generated_component_test.go"), md, packageName)
109+
filepath.Join(ymlDir, "generated_component_test.go"), md, packageName, noformat)
108110
if err != nil {
109111
return err
110112
}
@@ -124,7 +126,7 @@ func run(ymlPath string) error {
124126
}
125127

126128
err = generateFile(filepath.Join(tmplDir, "package_test.go.tmpl"),
127-
filepath.Join(ymlDir, "generated_package_test.go"), md, packageName)
129+
filepath.Join(ymlDir, "generated_package_test.go"), md, packageName, noformat)
128130
if err != nil {
129131
return err
130132
}
@@ -220,12 +222,12 @@ func run(ymlPath string) error {
220222
}
221223

222224
for tmpl, dst := range toGenerate {
223-
if err := generateFile(tmpl, dst, md, md.GeneratedPackageName); err != nil {
225+
if err := generateFile(tmpl, dst, md, md.GeneratedPackageName, noformat); err != nil {
224226
return err
225227
}
226228
}
227229

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

@@ -342,7 +344,7 @@ func getTemplateFuncMap(md Metadata) template.FuncMap {
342344
}
343345
return result.String()
344346
},
345-
"inc": func(i int) int { return i + 1 },
347+
"inc": func(i int) int { return i + 1 },
346348
"distroURL": distroURL,
347349
"isExporter": func() bool {
348350
return md.Status.Class == "exporter"
@@ -414,8 +416,8 @@ func executeTemplate(tmplFile string, md Metadata, goPackage string, fns templat
414416
return buf.Bytes(), nil
415417
}
416418

417-
func generateFile(tmplFile, outputFile string, md Metadata, goPackage string) error {
418-
return generateFileWithFns(tmplFile, outputFile, md, goPackage, getTemplateFuncMap(md))
419+
func generateFile(tmplFile, outputFile string, md Metadata, goPackage string, noformat bool) error {
420+
return generateFileWithFns(tmplFile, outputFile, md, goPackage, getTemplateFuncMap(md), noformat)
419421
}
420422

421423
func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPackage string) error {
@@ -447,7 +449,7 @@ func inlineReplace(tmplFile, outputFile string, md Metadata, start, end, goPacka
447449
return nil
448450
}
449451

450-
func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage string, fns template.FuncMap) error {
452+
func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage string, fns template.FuncMap, noformat bool) error {
451453
if err := os.Remove(outputFile); err != nil && !errors.Is(err, fs.ErrNotExist) {
452454
return fmt.Errorf("unable to remove generated file %q: %w", outputFile, err)
453455
}
@@ -457,7 +459,7 @@ func generateFileWithFns(tmplFile, outputFile string, md Metadata, goPackage str
457459
return err
458460
}
459461
var formatErr error
460-
if strings.HasSuffix(outputFile, ".go") {
462+
if strings.HasSuffix(outputFile, ".go") && !noformat {
461463
if formatted, err := format.Source(result); err == nil {
462464
result = formatted
463465
} else {
@@ -532,7 +534,7 @@ func validateYAMLKeyOrder(raw []byte) error {
532534
return nil
533535
}
534536

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

548-
if err := generateConfigGoStruct(md, mdDir); err != nil {
550+
if err := generateConfigGoStruct(md, mdDir, noformat); err != nil {
549551
return fmt.Errorf("failed to generate config Go struct: %w", err)
550552
}
551553
}
552554
return nil
553555
}
554556

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

565567
fns := cfggen.WithCfgFns(getTemplateFuncMap(md), rootPkg, md.PackageName)
566-
return generateFileWithFns(tmplFile, dstFile, md, packageName, fns)
568+
return generateFileWithFns(tmplFile, dstFile, md, packageName, fns, noformat)
567569
}

0 commit comments

Comments
 (0)