2025-04-29 17:35:21 +02:00
|
|
|
|
#
|
|
|
|
|
|
# Erminig - Création et mise à jour de la révision des fichiers pakva
|
|
|
|
|
|
# Copyright (C) 2025 L0m1g
|
|
|
|
|
|
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
|
|
|
|
|
|
#
|
|
|
|
|
|
# Ce fichier fait partie du projet Erminig.
|
|
|
|
|
|
# Libre comme l’air, stable comme un menhir, et salé comme le beurre.
|
|
|
|
|
|
#
|
|
|
|
|
|
|
2025-04-29 17:15:19 +02:00
|
|
|
|
from pathlib import Path
|
2025-05-03 18:33:53 +02:00
|
|
|
|
from erminig.core.config import Config
|
|
|
|
|
|
from erminig.core.security import run_as_user
|
2025-04-29 17:15:19 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Pakva:
|
|
|
|
|
|
|
2025-05-09 11:47:48 +02:00
|
|
|
|
def __init__(self, name, version=None, archive=None):
|
2025-04-29 17:15:19 +02:00
|
|
|
|
self.name = name
|
|
|
|
|
|
self.version = version
|
|
|
|
|
|
self.archive = archive
|
|
|
|
|
|
self.path = Config.GOVEL_DIR / name[0] / name / "Pakva"
|
|
|
|
|
|
|
|
|
|
|
|
@run_as_user("pak")
|
|
|
|
|
|
def save(self):
|
|
|
|
|
|
self.path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
with open(self.path, "w") as f:
|
|
|
|
|
|
f.write(
|
|
|
|
|
|
f"""\
|
|
|
|
|
|
name="{self.name}"
|
|
|
|
|
|
version="{self.version}"
|
|
|
|
|
|
revision=1
|
|
|
|
|
|
source=("{self.archive}")
|
|
|
|
|
|
|
|
|
|
|
|
build() {{
|
|
|
|
|
|
echo "Build function not implemented"
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
|
|
pak() {{
|
|
|
|
|
|
echo "Packaging function not implemented"
|
|
|
|
|
|
}}
|
|
|
|
|
|
"""
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@run_as_user("pak")
|
|
|
|
|
|
def update_version(self, version, archive, reset_revision=False):
|
|
|
|
|
|
if not self.path.exists():
|
|
|
|
|
|
raise FileNotFoundError(f"Aucun fichier Pakva pour {self.name}")
|
|
|
|
|
|
|
|
|
|
|
|
with open(self.path, "r") as f:
|
|
|
|
|
|
lines = f.readlines()
|
|
|
|
|
|
|
|
|
|
|
|
new_lines = []
|
|
|
|
|
|
updated_version = False
|
|
|
|
|
|
updated_source = False
|
|
|
|
|
|
|
|
|
|
|
|
for line in lines:
|
|
|
|
|
|
if line.startswith("version=") and not updated_version:
|
|
|
|
|
|
new_lines.append(f'version="{version}"\n')
|
|
|
|
|
|
updated_version = True
|
|
|
|
|
|
elif line.startswith("source=") and not updated_source:
|
|
|
|
|
|
new_lines.append(f'source=("{archive}")\n')
|
|
|
|
|
|
updated_source = True
|
|
|
|
|
|
elif reset_revision and line.startswith("revision="):
|
|
|
|
|
|
new_lines.append("revision=1\n")
|
|
|
|
|
|
else:
|
|
|
|
|
|
new_lines.append(line)
|
|
|
|
|
|
|
|
|
|
|
|
# Ajout si jamais les champs n'existaient pas
|
|
|
|
|
|
if not updated_version:
|
|
|
|
|
|
new_lines.insert(1, f'version="{version}"\n')
|
|
|
|
|
|
if not updated_source:
|
|
|
|
|
|
new_lines.append(f'source=("{archive}")\n')
|
|
|
|
|
|
if reset_revision and not any(line.startswith("revision=") for line in lines):
|
|
|
|
|
|
new_lines.insert(2, "revision=1\n")
|
|
|
|
|
|
|
|
|
|
|
|
with open(self.path, "w") as f:
|
|
|
|
|
|
f.writelines(new_lines)
|
|
|
|
|
|
|
|
|
|
|
|
self.version = version
|
|
|
|
|
|
self.archive = archive
|
|
|
|
|
|
print(f"[Pakva] Version mise à jour pour {self.name} -> {version}")
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def read(cls, path):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Lit un fichier Pakva et retourne un objet Pakva.
|
|
|
|
|
|
"""
|
|
|
|
|
|
path = Path(path)
|
|
|
|
|
|
if not path.exists():
|
|
|
|
|
|
raise FileNotFoundError(f"Fichier Pakva introuvable : {path}")
|
|
|
|
|
|
|
|
|
|
|
|
with path.open() as f:
|
|
|
|
|
|
lines = f.readlines()
|
|
|
|
|
|
|
|
|
|
|
|
name = None
|
|
|
|
|
|
version = None
|
|
|
|
|
|
archive = None
|
|
|
|
|
|
|
|
|
|
|
|
for line in lines:
|
|
|
|
|
|
if line.startswith("name="):
|
|
|
|
|
|
name = line.split("=")[1].strip().strip('"')
|
|
|
|
|
|
elif line.startswith("version="):
|
|
|
|
|
|
version = line.split("=")[1].strip().strip('"')
|
|
|
|
|
|
elif line.startswith("source=("):
|
|
|
|
|
|
archive = line.split("(")[1].split(")")[0].strip().strip('"')
|
|
|
|
|
|
|
|
|
|
|
|
obj = cls(name, version, archive)
|
|
|
|
|
|
obj.path = path
|
|
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
|
return f"<Pakva {self.name}-{self.version}>"
|
2025-05-05 16:27:52 +02:00
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def load_from_name(cls, name):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Charge un fichier Pakva depuis son nom uniquement.
|
|
|
|
|
|
"""
|
|
|
|
|
|
path = Config.GOVEL_DIR / name[0] / name / "Pakva"
|
|
|
|
|
|
return cls.read(path)
|