Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package helm-schema for openSUSE:Factory checked in at 2026-02-13 12:47:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/helm-schema (Old) and /work/SRC/openSUSE:Factory/.helm-schema.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "helm-schema" Fri Feb 13 12:47:37 2026 rev:5 rq:1332801 version:0.21.2 Changes: -------- --- /work/SRC/openSUSE:Factory/helm-schema/helm-schema.changes 2026-02-09 15:35:44.369637691 +0100 +++ /work/SRC/openSUSE:Factory/.helm-schema.new.1977/helm-schema.changes 2026-02-13 12:47:47.144917662 +0100 @@ -1,0 +2,7 @@ +Fri Feb 13 06:16:39 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.21.2: + * fix: Fixed various bugs and improved docs + * chore(deps): update actions/checkout digest to de0fac2 + +------------------------------------------------------------------- Old: ---- helm-schema-0.21.1.obscpio New: ---- helm-schema-0.21.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ helm-schema.spec ++++++ --- /var/tmp/diff_new_pack.AgqmFQ/_old 2026-02-13 12:47:50.301049845 +0100 +++ /var/tmp/diff_new_pack.AgqmFQ/_new 2026-02-13 12:47:50.305050013 +0100 @@ -17,7 +17,7 @@ Name: helm-schema -Version: 0.21.1 +Version: 0.21.2 Release: 0 Summary: Generate jsonschemas from helm charts License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.AgqmFQ/_old 2026-02-13 12:47:50.349051856 +0100 +++ /var/tmp/diff_new_pack.AgqmFQ/_new 2026-02-13 12:47:50.353052023 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/dadav/helm-schema</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">0.21.1</param> + <param name="revision">0.21.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.AgqmFQ/_old 2026-02-13 12:47:50.385053363 +0100 +++ /var/tmp/diff_new_pack.AgqmFQ/_new 2026-02-13 12:47:50.389053530 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/dadav/helm-schema</param> - <param name="changesrevision">c0ca4c5c600f237539b2a1e5fbfcac7bb963bbbc</param></service></servicedata> + <param name="changesrevision">4c9eab6daa858d237826da64c21ad0d8eae0486e</param></service></servicedata> (No newline at EOF) ++++++ helm-schema-0.21.1.obscpio -> helm-schema-0.21.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/CLAUDE.md new/helm-schema-0.21.2/CLAUDE.md --- old/helm-schema-0.21.1/CLAUDE.md 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/CLAUDE.md 2026-02-12 21:40:06.000000000 +0100 @@ -9,6 +9,7 @@ ## Build and Test Commands ### Build + ```bash # Build the binary go build -o helm-schema ./cmd/helm-schema @@ -18,6 +19,7 @@ ``` ### Test + ```bash # Run all tests go test ./... @@ -37,6 +39,7 @@ ``` ### Linting and Formatting + ```bash # Format code go fmt ./... @@ -66,6 +69,7 @@ ### Key Components #### Schema Parsing (`pkg/schema/schema.go`) + - **`ParseValues()`**: Main entry point that parses a values.yaml file and returns a Schema - **`parseYamlNode()`**: Recursively traverses YAML nodes, extracting schema annotations and inferring types - **Annotation blocks**: Comments between `# @schema` markers are parsed as YAML to extract JSON Schema properties @@ -73,6 +77,7 @@ - **Type inference**: If no type is specified, the tool infers it from YAML tags (!!str, !!int, !!bool, etc.) #### Worker Pattern (`pkg/schema/worker.go`) + - Workers pull chart paths from a channel and process them independently - Each worker: 1. Reads Chart.yaml @@ -81,15 +86,18 @@ 4. Sends Result to results channel #### Dependency Graph (`pkg/schema/toposort.go`) + - **TopoSort()**: Uses DFS-based topological sorting to ensure dependencies are processed before dependents - Detects circular dependencies and can either fail or warn based on `allowCircular` flag - Returns charts in dependency order (dependencies first, parents last) #### Chart Models (`pkg/chart/chart.go`) + - **ChartFile**: Represents Chart.yaml structure - **Dependency**: Represents a chart dependency with name, version, alias, condition #### Schema Merging (in `main.go`) + - Regular dependencies: Nested under dependency name (or alias) in parent schema - Library charts: Properties merged directly into parent schema at top level - Conditional dependencies: If a dependency has a `condition` field, the corresponding boolean property is auto-created in the dependency's schema @@ -144,6 +152,7 @@ ### Verification Process Users can verify plugins with: + ```bash helm plugin install <tarball> --verify helm plugin verify schema @@ -154,6 +163,7 @@ The Schema struct (`pkg/schema/schema.go`) supports the following JSON Schema Draft 7 keywords: ### Core Keywords + - `$schema`, `$id`, `$ref`, `$comment` - `type` (single type or array of types) - `title`, `description` @@ -163,17 +173,20 @@ ### Validation Keywords #### Numeric (number, integer) + - `minimum`, `maximum` (float64 - supports decimal values like `1.5`) - `exclusiveMinimum`, `exclusiveMaximum` (float64) - `multipleOf` (float64 - supports `0.1`, `0.01`, etc.) #### String + - `minLength`, `maxLength` - `pattern` (regex pattern) - `format` (date-time, email, uri, ipv4, ipv6, uuid, etc.) - `contentEncoding`, `contentMediaType` #### Array + - `items` (single schema or handled via anyOf for arrays) - `additionalItems` (boolean or schema) - `minItems`, `maxItems` @@ -181,6 +194,7 @@ - `contains` #### Object + - `properties`, `patternProperties` - `additionalProperties` (boolean or schema) - `required` (boolean or array of strings) @@ -189,16 +203,24 @@ - `dependencies` ### Composition Keywords + - `allOf`, `anyOf`, `oneOf`, `not` - `if`, `then`, `else` ### Annotation Keywords + - `deprecated`, `readOnly`, `writeOnly` - `enum`, `const` ### Custom Annotations + - Any key prefixed with `x-` is treated as a custom annotation +## Documentation Notes + +- README plugin verification examples should use a `vX.Y.Z` placeholder to avoid version drift. +- GPG public key fingerprint (from `signing-key.asc`) is `806F 70D2 5667 D42A AE4E 07CE F587 0796 9D0F BFA5`; key ID is `F58707969D0FBFA5`. + ## Validation Behavior The schema validation (`Validate()` method) performs type-specific constraint checks: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/README.md new/helm-schema-0.21.2/README.md --- old/helm-schema-0.21.1/README.md 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/README.md 2026-02-12 21:40:06.000000000 +0100 @@ -58,7 +58,7 @@ ```sh # Install from a specific release with automatic verification -helm plugin install https://github.com/dadav/helm-schema/releases/download/v0.18.1/helm-schema_0.18.1_Linux_x86_64.tar.gz +helm plugin install https://github.com/dadav/helm-schema/releases/download/vX.Y.Z/helm-schema_X.Y.Z_Linux_x86_64.tar.gz ``` **Manual Verification** @@ -66,11 +66,17 @@ Before installing, import the signing key: ```sh -# Import the public signing key -gpg --keyserver keyserver.ubuntu.com --recv-keys [KEY_ID] +# Import the public signing key (from file) +gpg --import signing-key.asc + +# Or import by key ID (last 16 hex chars of the fingerprint) +gpg --keyserver keyserver.ubuntu.com --recv-keys F58707969D0FBFA5 + +# Verify the imported key fingerprint (expect: 806F 70D2 5667 D42A AE4E 07CE F587 0796 9D0F BFA5) +gpg --fingerprint F58707969D0FBFA5 # Install with explicit verification -helm plugin install https://github.com/dadav/helm-schema/releases/download/v0.18.1/helm-schema_0.18.1_Linux_x86_64.tar.gz --verify +helm plugin install https://github.com/dadav/helm-schema/releases/download/vX.Y.Z/helm-schema_X.Y.Z_Linux_x86_64.tar.gz --verify ``` **Verify Installed Plugin** @@ -118,13 +124,13 @@ -a, --append-newline "append newline to generated jsonschema at the end of the file" -c, --chart-search-root string "directory to search recursively within for charts (default ".")" -i, --dependencies-filter strings "only generate schema for specified dependencies (comma-separated list of dependency names)" - -g, --dont-add-global "dont auto add global property" + -g, --dont-add-global "don't auto add global property" -x, --dont-strip-helm-docs-prefix "disable the removal of the helm-docs prefix (--)" -d, --dry-run "don't actually create files just print to stdout passed" -p, --helm-docs-compatibility-mode "parse and use helm-docs comments" -h, --help "help for helm-schema" -s, --keep-full-comment "keep the whole leading comment (default: cut at empty line)" - -l, --log-level string "level of logs that should printed, one of (panic, fatal, error, warning, info, debug, trace) (default "info")" + -l, --log-level string "level of logs that should be printed, one of (panic, fatal, error, warning, info, debug, trace) (default "info")" -n, --no-dependencies "don't analyze dependencies" -o, --output-file string "jsonschema file path relative to each chart directory to which jsonschema will be written (default 'values.schema.json')" -m, --skip-dependencies-schema-validation "skip schema validation for dependencies by setting additionalProperties to true and removing from required" @@ -266,7 +272,7 @@ ## Dependencies -Per default, `helm-schema` will try to also create the schemas for the dependencies in their respective chart directory. These schemas will be merged as properties in the main schema, but the `requiredProperties` field will be nullified, otherwise you would have to always overwrite all the required fields. +By default, `helm-schema` will try to also create the schemas for the dependencies in their respective chart directory. These schemas will be merged as properties in the main schema, but the `requiredProperties` field will be nullified, otherwise you would have to always overwrite all the required fields. If you don't want to generate `jsonschema` for chart dependencies, you can use the `-n, --no-dependencies` option to only generate the `values.schema.json` for your parent chart(s) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/cmd/helm-schema/main.go new/helm-schema-0.21.2/cmd/helm-schema/main.go --- old/helm-schema-0.21.1/cmd/helm-schema/main.go 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/cmd/helm-schema/main.go 2026-02-12 21:40:06.000000000 +0100 @@ -135,7 +135,7 @@ } // Drain any remaining errors -drainErrors: + drainErrors: for { select { case err, ok := <-errs: @@ -181,7 +181,7 @@ } } - conditionsToPatch := make(map[string][]string) + conditionsToPatch := make(map[string][][]string) if !noDeps { for _, result := range results { if len(result.Errors) > 0 { @@ -194,7 +194,16 @@ if dep.Condition != "" { conditionKeys := strings.Split(dep.Condition, ".") - conditionsToPatch[conditionKeys[0]] = conditionKeys[1:] + if len(conditionKeys) == 1 { + continue + } + targetName := conditionKeys[0] + if dep.Alias != "" && dep.Alias == conditionKeys[0] { + targetName = dep.Name + } + if targetName != "" { + conditionsToPatch[targetName] = append(conditionsToPatch[targetName], conditionKeys[1:]) + } } } } @@ -232,36 +241,38 @@ chartNameToResult[result.Chart.Name] = result log.Debugf("Stored chart %s in chartNameToResult", result.Chart.Name) - if patch, ok := conditionsToPatch[result.Chart.Name]; ok { - schemaToPatch := &result.Schema - lastIndex := len(patch) - 1 - for i, key := range patch { - // Ensure Properties map is initialized - if schemaToPatch.Properties == nil { - schemaToPatch.Properties = make(map[string]*schema.Schema) - } - if alreadyPresentSchema, ok := schemaToPatch.Properties[key]; !ok { - log.Debugf( - "Patching conditional field \"%s\" into schema of chart %s", - key, - result.Chart.Name, - ) - if i == lastIndex { - schemaToPatch.Properties[key] = &schema.Schema{ - Type: []string{"boolean"}, - Title: key, - Description: "Conditional property used in parent chart", + if patches, ok := conditionsToPatch[result.Chart.Name]; ok { + for _, patch := range patches { + schemaToPatch := &result.Schema + lastIndex := len(patch) - 1 + for i, key := range patch { + // Ensure Properties map is initialized + if schemaToPatch.Properties == nil { + schemaToPatch.Properties = make(map[string]*schema.Schema) + } + if alreadyPresentSchema, ok := schemaToPatch.Properties[key]; !ok { + log.Debugf( + "Patching conditional field \"%s\" into schema of chart %s", + key, + result.Chart.Name, + ) + if i == lastIndex { + schemaToPatch.Properties[key] = &schema.Schema{ + Type: []string{"boolean"}, + Title: key, + Description: "Conditional property used in parent chart", + } + } else { + schemaToPatch.Properties[key] = &schema.Schema{ + Type: []string{"object"}, + Title: key, + Properties: make(map[string]*schema.Schema), + } + schemaToPatch = schemaToPatch.Properties[key] } } else { - schemaToPatch.Properties[key] = &schema.Schema{ - Type: []string{"object"}, - Title: key, - Properties: make(map[string]*schema.Schema), - } - schemaToPatch = schemaToPatch.Properties[key] + schemaToPatch = alreadyPresentSchema } - } else { - schemaToPatch = alreadyPresentSchema } } } @@ -303,6 +314,9 @@ Description: dependencyResult.Chart.Description, Properties: dependencyResult.Schema.Properties, } + if dep.Condition != "" && !strings.Contains(dep.Condition, ".") { + depSchema.Type = []string{"object", "boolean"} + } depSchema.DisableRequiredProperties() if dep.Alias != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/cmd/helm-schema/version.go new/helm-schema-0.21.2/cmd/helm-schema/version.go --- old/helm-schema-0.21.1/cmd/helm-schema/version.go 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/cmd/helm-schema/version.go 2026-02-12 21:40:06.000000000 +0100 @@ -1,3 +1,3 @@ package main -var version string = "0.21.1" +var version string = "0.21.2" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/pkg/schema/schema.go new/helm-schema-0.21.2/pkg/schema/schema.go --- old/helm-schema-0.21.1/pkg/schema/schema.go 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/pkg/schema/schema.go 2026-02-12 21:40:06.000000000 +0100 @@ -841,14 +841,6 @@ } func (s Schema) validateTypeConstraints() error { - if s.Const != nil && !s.Type.IsEmpty() { - return errors.New("cannot use both 'const' and 'type' in the same schema") - } - - if s.Enum != nil && !s.Type.IsEmpty() { - return errors.New("cannot use both 'enum' and 'type' in the same schema") - } - return nil } @@ -1249,7 +1241,11 @@ } if !slices.Contains(schema.Type, "object") { // If .Properties is set, type must be object - schema.Type = []string{"object"} + if len(schema.Type) == 0 { + schema.Type = []string{"object"} + } else { + schema.Type = append(schema.Type, "object") + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/pkg/schema/worker.go new/helm-schema-0.21.2/pkg/schema/worker.go --- old/helm-schema-0.21.1/pkg/schema/worker.go 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/pkg/schema/worker.go 2026-02-12 21:40:06.000000000 +0100 @@ -97,7 +97,7 @@ } // Check if we need to add a schema reference - if addSchemaReference { + if addSchemaReference && !dryRun { schemaRef := `# yaml-language-server: $schema=values.schema.json` if !strings.Contains(string(content), schemaRef) { err = util.PrefixFirstYamlDocument(schemaRef, valuesPath) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-schema-0.21.1/pkg/schema/worker_test.go new/helm-schema-0.21.2/pkg/schema/worker_test.go --- old/helm-schema-0.21.1/pkg/schema/worker_test.go 2026-02-09 06:52:57.000000000 +0100 +++ new/helm-schema-0.21.2/pkg/schema/worker_test.go 2026-02-12 21:40:06.000000000 +0100 @@ -152,3 +152,43 @@ }) } } + +func TestWorker_DryRunDoesNotWriteSchemaReference(t *testing.T) { + tmpDir := t.TempDir() + + chartPath := filepath.Join(tmpDir, "Chart.yaml") + valuesPath := filepath.Join(tmpDir, "values.yaml") + + err := os.WriteFile(chartPath, []byte("apiVersion: v2\nname: test-chart\nversion: 1.0.0\n"), 0o644) + assert.NoError(t, err) + err = os.WriteFile(valuesPath, []byte("key: value\n"), 0o644) + assert.NoError(t, err) + + queue := make(chan string, 1) + results := make(chan Result, 1) + queue <- chartPath + close(queue) + + Worker( + true, // dryRun + false, // uncomment + true, // addSchemaReference + false, // keepFullComment + false, // helmDocsCompatibilityMode + false, // dontRemoveHelmDocsPrefix + false, // dontAddGlobal + false, // annotate + []string{"values.yaml"}, + &SkipAutoGenerationConfig{}, + "values.schema.json", + queue, + results, + ) + + result := <-results + assert.Empty(t, result.Errors) + + updated, err := os.ReadFile(valuesPath) + assert.NoError(t, err) + assert.NotContains(t, string(updated), "yaml-language-server: $schema=values.schema.json") +} ++++++ helm-schema.obsinfo ++++++ --- /var/tmp/diff_new_pack.AgqmFQ/_old 2026-02-13 12:47:50.645064253 +0100 +++ /var/tmp/diff_new_pack.AgqmFQ/_new 2026-02-13 12:47:50.661064923 +0100 @@ -1,5 +1,5 @@ name: helm-schema -version: 0.21.1 -mtime: 1770616377 -commit: c0ca4c5c600f237539b2a1e5fbfcac7bb963bbbc +version: 0.21.2 +mtime: 1770928806 +commit: 4c9eab6daa858d237826da64c21ad0d8eae0486e ++++++ vendor.tar.gz ++++++
