Compare commits

..

2 Commits

Author SHA1 Message Date
janishutz 541a876307 feat(config): Schema validator, initial config merger setup 2026-04-23 11:31:01 +02:00
janishutz 5126e0373f feat(PKGBUILD): First setup 2026-04-23 11:30:31 +02:00
8 changed files with 92 additions and 2 deletions
+28
View File
@@ -0,0 +1,28 @@
# Maintainer: Janis Hutz <development@janishutz.com>
pkgname=archmgr-git
pkgver=0.0.0
pkgrel=1
pkgdesc='A nixos-like declarative config and package manager for Arch Linux'
arch=('any')
url="https://github.com/janishutz/archmgr"
license=('GPL3')
depends=('python', 'python-pyaml')
makedepends=('git')
provides=('archmgr')
conflicts=('archmgr')
source=("$pkgname"::git+${url}.git)
sha256sums=('SKIP') # TODO: Add?
pkgver() {
cd "${pkgname}"
# TODO: For the non-git pkgbuild, need to use different output
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
package() {
cd "${pkgname}"
# TODO: Need to finish
}
+2
View File
@@ -9,6 +9,7 @@ import commands.init as init
import commands.pull as pull import commands.pull as pull
import commands.push as push import commands.push as push
import commands.prepare as setup import commands.prepare as setup
from config import load_config
if __name__ == "__main__": if __name__ == "__main__":
args, ap = cliargs.add_cli_args() args, ap = cliargs.add_cli_args()
@@ -29,6 +30,7 @@ if __name__ == "__main__":
\\___/ \\___/
""") """)
print(load_config("config.yml"))
try: try:
if args.cmd == "commit": if args.cmd == "commit":
commit.commit(args.force, args.no_render) commit.commit(args.force, args.no_render)
+6
View File
@@ -88,6 +88,12 @@
}, },
"maxItems": 5, "maxItems": 5,
"minItems": 1 "minItems": 1
},
"count": {
"type": "number",
"description": "The number of mirrors to add to the list",
"maximum": 20,
"minimum": 3
} }
}, },
"required": [ "required": [
+31
View File
@@ -0,0 +1,31 @@
from typing import Any, cast
import yaml
from config import validator
from config.merger import merge_configs
def _load_config_file(file: str):
with open(file, "r") as f:
parsed = yaml.load(f, Loader=yaml.FullLoader)
return parsed
def load_config(file: str):
# Load and validate initial config
try:
loaded_conf = _load_config_file(file)
except Exception:
return {}
if not validator.validate(loaded_conf):
return {}
conf = cast(dict[str, Any], loaded_conf)
requires = cast(list[str], conf["requires"])
conf.pop("requires")
# Recursively load files
for conf_file in requires:
conf = merge_configs(conf, load_config(conf_file))
return conf
+6
View File
@@ -0,0 +1,6 @@
def merge_configs(config: dict, new_config: dict):
if len(new_config) == 0 or len(config) == 0:
return config
# Merge configs
return config
View File
+18 -2
View File
@@ -1,2 +1,18 @@
def validate(): import json
pass import jsonschema
with open("config.schema.json") as file:
schema = json.load(file)
def validate(config):
try:
jsonschema.validate(config, schema)
except jsonschema.SchemaError:
print("Schema invalid")
return False
except jsonschema.ValidationError:
print("Config invalid")
return False
return True
+1
View File
@@ -1,3 +1,4 @@
pyyaml
pylette pylette
argcomplete argcomplete
inquirer inquirer