feat: JSON Schema validation for metadata.yaml as pre-commit hook
Adds schema/metadata.json (JSON Schema draft-07) as the authoritative schema for all rpms/*/metadata.yaml files. Key constraints: - additionalProperties: false at both the top level and builds items, so unknown fields are rejected outright - name allows dots (fixes neovim-glibc-2.17) - github is optional (fixes claude-code, which has no GitHub repo) - repository enum includes fedora/42, fedora/43, fedora/44 - dist_tag boolean field documented in schema Pre-commit hook (check-jsonschema 0.37.2) runs against every file matching ^rpms/[^/]+/metadata\.yaml$ on every commit. Also fixes rpms/claude-code/metadata.yaml: removes the unknown claude_ai field and normalises field order.
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"additionalProperties": false,
|
||||
"description": "Schema for rpms/*/metadata.yaml files",
|
||||
"properties": {
|
||||
"arch": {
|
||||
"enum": [
|
||||
"amd64",
|
||||
"arm64",
|
||||
"x86_64"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"builds": {
|
||||
"items": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"image": {
|
||||
"minLength": 1,
|
||||
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9\\-_.:/@]+$",
|
||||
"type": "string"
|
||||
},
|
||||
"release": {
|
||||
"oneOf": [
|
||||
{
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "number"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"items": {
|
||||
"enum": [
|
||||
"almalinux/el8",
|
||||
"almalinux/el9",
|
||||
"fedora/42",
|
||||
"fedora/43",
|
||||
"fedora/44"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 1,
|
||||
"type": "array"
|
||||
},
|
||||
"version": {
|
||||
"minLength": 1,
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)*(-[a-zA-Z0-9]+)*$",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"repository",
|
||||
"image",
|
||||
"release",
|
||||
"version"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"minItems": 1,
|
||||
"type": "array"
|
||||
},
|
||||
"description": {
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"dist_tag": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"github": {
|
||||
"minLength": 1,
|
||||
"pattern": "^[a-zA-Z0-9\\-_]+/[a-zA-Z0-9\\-_.]+$",
|
||||
"type": "string"
|
||||
},
|
||||
"github_release_pattern": {
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"homepage": {
|
||||
"minLength": 1,
|
||||
"pattern": "^https?://.+",
|
||||
"type": "string"
|
||||
},
|
||||
"license": {
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"maintainer": {
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"minLength": 1,
|
||||
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9\\-_.]*$",
|
||||
"type": "string"
|
||||
},
|
||||
"platform": {
|
||||
"minLength": 1,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"description",
|
||||
"builds"
|
||||
],
|
||||
"title": "RPM Package Metadata",
|
||||
"type": "object"
|
||||
}
|
||||
Reference in New Issue
Block a user