grafana-cli: Diff generated ts directly instead of relying on git (#45815)

* Add diffing support to grafana-cli cue gen-ts

* Rely on diff comparison in cuetsify pipeline step

* Ignore *.gen.ts files with eslint

* Chore: Fix lint `sdboyer/cuetsify-compare` (#45818)

* Sync drone

(cherry picked from commit 40645ab19e39ff9b0a12b7ebb13a4dc4c5e1d472)

* Fix lint

(cherry picked from commit c95ece983984432fea029335b2b729b09d76c7eb)

* Sign drone

Co-authored-by: Dimitris Sotirakis <sotirakis.dim@gmail.com>
This commit is contained in:
sam boyer 2022-02-24 06:03:07 -05:00 committed by GitHub
parent 8d57318941
commit 60db643983
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 97 additions and 101 deletions

View File

@ -159,22 +159,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -686,22 +678,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -1290,22 +1274,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -1880,22 +1856,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -3044,22 +3012,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -3561,22 +3521,14 @@ steps:
image: grafana/build-container:1.5.1
name: validate-scuemata
- commands:
- '# Make sure the git tree is clean.'
- '# Stashing changes, since packages that were produced in build-backend step are
needed.'
- git stash
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .
- '# The above command generates Typescript files (*.gen.ts) from all appropriate
.cue files.'
- '# It is required that the generated Typescript be in sync with the input CUE
files.'
- '# ...Modulo eslint auto-fixes...:'
- yarn run eslint . --ext .gen.ts --fix
- '# If any filenames are emitted by the below script, run the generator command
`grafana-cli cue gen-ts` locally and commit the result.'
- ./scripts/clean-git-or-error.sh
- '# Un-stash changes.'
- git stash pop
- '# To enforce this, the following command will attempt to generate Typescript
from all'
- '# appropriate .cue files, then compare with the corresponding (*.gen.ts) file
the generated'
- '# code would have been written to. It exits 1 if any diffs are found.'
- ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff
depends_on:
- validate-scuemata
image: grafana/build-container:1.5.1
@ -4305,6 +4257,6 @@ kind: secret
name: gcp_upload_artifacts_key
---
kind: signature
hmac: b92ebbf48ca675f25c96f4b182a72c08b0e79f9c50d29caaacab124e97f32b4d
hmac: fb2a26bf088c9ff2b7cc63cee4fa1f1da06baf560265df4703414f4db9c90708
...

View File

@ -10,6 +10,9 @@ scripts/grafana-server/tmp
public/lib/monaco
deployment_tools_config.json
# TS generate from cue by cuetsy
**/*.gen.ts
# Auto-generated localisation files
public/locales/_build/
public/locales/**/*.js

View File

@ -257,6 +257,11 @@ so must be recompiled to validate newly-added CUE files.`,
Name: "grafana-root",
Usage: "path to the root of a Grafana repository in which to generate TypeScript from CUE files",
},
&cli.BoolFlag{
Name: "diff",
Usage: "diff results of codegen against files already on disk. Exits 1 if diff is non-empty",
Value: false,
},
},
},
}

View File

@ -17,6 +17,7 @@ import (
"cuelang.org/go/cue/errors"
cload "cuelang.org/go/cue/load"
"cuelang.org/go/cue/parser"
"github.com/google/go-cmp/cmp"
"github.com/grafana/cuetsy"
"github.com/grafana/grafana/pkg/cmd/grafana-cli/utils"
"github.com/grafana/grafana/pkg/schema/load"
@ -63,6 +64,7 @@ var skipPaths = []string{
const prefix = "/"
//nolint: gocyclo
func (cmd Command) generateTypescript(c utils.CommandLine) error {
root := c.String("grafana-root")
if root == "" {
@ -237,13 +239,46 @@ func (cmd Command) generateTypescript(c utils.CommandLine) error {
return gerrors.New(errors.Details(err, nil))
}
diff := c.Bool("diff")
var derr bool
for of, b := range outfiles {
err := os.WriteFile(filepath.Join(root, of), b, 0644)
if err != nil {
return err
p := filepath.Join(root, of)
if diff {
if _, err := os.Stat(p); err != nil {
if errors.Is(err, os.ErrNotExist) {
fmt.Printf("%s: no generated code file to compare against\n", p)
derr = true
continue
}
return fmt.Errorf("%s: %w", p, err)
}
f, err := os.Open(filepath.Clean(p))
if err != nil {
return fmt.Errorf("%s: %w", p, err)
}
ob, err := io.ReadAll(f)
if err != nil {
return err
}
dstr := cmp.Diff(string(ob), string(b))
if dstr != "" {
derr = true
fmt.Printf("%s would have changed:\n%s\n", p, dstr)
}
} else {
err := os.WriteFile(p, b, 0644)
if err != nil {
return err
}
}
}
if derr {
return errors.New("some files changed")
}
return nil
}
@ -283,7 +318,7 @@ func toOverlay(prefix string, vfs fs.FS, overlay map[string]cload.Source) error
if !filepath.IsAbs(prefix) {
return fmt.Errorf("must provide absolute path prefix when generating cue overlay, got %q", prefix)
}
err := fs.WalkDir(vfs, ".", (func(path string, d fs.DirEntry, err error) error {
err := fs.WalkDir(vfs, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
@ -296,6 +331,12 @@ func toOverlay(prefix string, vfs fs.FS, overlay map[string]cload.Source) error
if err != nil {
return err
}
defer func(f fs.File) {
err := f.Close()
if err != nil {
return
}
}(f)
b, err := io.ReadAll(f)
if err != nil {
@ -304,7 +345,7 @@ func toOverlay(prefix string, vfs fs.FS, overlay map[string]cload.Source) error
overlay[filepath.Join(prefix, path)] = cload.FromBytes(b)
return nil
}))
})
if err != nil {
return err

View File

@ -2,8 +2,10 @@
// This file was autogenerated by cuetsy. DO NOT EDIT!
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export const modelVersion = Object.freeze([0, 0]);
export interface PanelOptions {
feedUrl?: string;
showImage?: boolean;

View File

@ -1134,18 +1134,11 @@ def ensure_cuetsified_step():
'validate-scuemata',
],
'commands': [
'# Make sure the git tree is clean.',
'# Stashing changes, since packages that were produced in build-backend step are needed.',
'git stash',
'./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root .',
'# The above command generates Typescript files (*.gen.ts) from all appropriate .cue files.',
'# It is required that the generated Typescript be in sync with the input CUE files.',
'# ...Modulo eslint auto-fixes...:',
'yarn run eslint . --ext .gen.ts --fix',
'# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.',
'./scripts/clean-git-or-error.sh',
'# Un-stash changes.',
'git stash pop',
'# To enforce this, the following command will attempt to generate Typescript from all',
'# appropriate .cue files, then compare with the corresponding (*.gen.ts) file the generated',
'# code would have been written to. It exits 1 if any diffs are found.',
'./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . --diff',
],
}